C 1 C-Code auf ATMEGA8 und ATtiny13

flecralf

Mitglied
25. Juli 2013
194
2
18
Sprachen
  1. ANSI C
Hallo alle zusammen,
nach anfänglichen Erfolgen auf dem Atmega8 wollte ich mein Glück auf einem Attiny13 probieren.
Nachdem irgendwie auf dem Tiny gar nix lief, adaptierte ich einen simplen Code vom Mega und musste feststellen, daß
der Ablauf ein anderer ist.
Das Programm soll die LED an PB0 dauernd leuchten lassen. Falls auf PB1 ein Signal anliegt soll die LED kurz mehrfach blinken und
dann soll Schluß sein.
Auf dem Tiny blinkt nichts, die Schleife wird nie erreicht.
Nachdem ich nun schon ca. 8 h suche, möchte ich meine Frage mal weitergeben.
Gruß
Ralf


Code:
#include <avr/io.h>

#define F_CPU 1200000UL  // ATTINY13a
//#define F_CPU 8000000UL  // ATMEGA8

#include <util/delay.h>
 DDRB = 0xff;
int i;
int main() {
int iloop = 1;
PORTB = 1;
while(iloop == 1) {
     if(bit_is_set(PINB,1))
     {
     PORTB = 0b00000000;
     
     for(i=0;i<=5;i++)
     {
     PORTB = 0b00000001;
     _delay_ms(200);
     PORTB = 0b00000000;
     _delay_ms(800);
         }
          PORTB = 0b00000000;
     iloop = 0;
     }
          }
                                              
return 1;
}
 
Hallo Ralf,

Willkommen im AVR-PRAXiS-Forum :)

Der Fehler liegt bei der Definition von Input/Output/Pullup der IO-Pins.

Wichtig ist auch, dass du in den Projekteinstellungen den richtigen Mikrocontroller auswählst.


In deinem Code steht DDRB = 0xFF ausserhalb einer Funktion, sowas gehört in eine Funktion. Dies würde aber alle Pins von PORTB als Ausgang schalten.

Hier ist mal ein Code-Beispiel (musst du für dich etwas anpassen), dies wird dir sicherlich weiterhelfen.

Dirk :ciao:

Code:
int main (void)
{

  // Initialisierungen

  // Pin PB0 für LED: Ausgang und high
  PORTB |= 1<<PB0; // high
  DDRB |= 1<<PB0;  // Ausgang

  // Pin PB1 für Taster: Input und Pullup aktiviert
  PORTB |= 1<<PB1; // Pullup aktivieren bei Eingangspin, falls hier kein Taster angeschlossen ist und der Pullup nicht aktiviert werden soll, dann das Bit auf low lassen
  DDRB &= ~(1<<PB1); // Input (ist nach Reset nicht notwendig, da bereits Input)


  // main loop
  while (1)
  {

    if (!(PINB & (1<<PB1))) // hier kannst du natürlich dein Macro bit_is_set beibehalten
    {
      // Signal an PB1 ist low (zb. Taster gedrückt)
      // hier deine LED an PB0 blinken lassen, hier mal ohne Pause, ohne loop an und aus (nur prinzipiell, das wird man nicht sehen ;-):

      PORTB &= ~(1<<PB0);  // low, LED an
      PORTB |= 1<<PB0;  // high, LED aus


    }

  }

  return 1;
}


Achtung, du verlässt bei dir eventuell main loop und damit main().

while(iloop == 1)


Du muss innerhalb main in einer Endlosschleife bleiben. Wir haben hier kein PC-Programm bei dem das Programm durch return von main() beendet wird :)
 
Hallo Dirk,
Danke !!!
:adore:

Ein Problem ist, dass meine C-Kenntnisse schon 10 Jahre zurückliegen.
Bitoperationen und Manipulationen sind mir nicht mehr geläufig.
Das andere ist die Geschichte mit den Pull-Ups.
Verstehe ist das richtig ?
Wenn der Ausgang auf 1 ist schaltet der Ausgangs-
transistor auf Masse, d.h. Spannung gleich 0.
Also Open-Kollektor ?

Offtopic:
Außerdem habe ich gerade den Attiny13a geschossen.
Fehlermeldung: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.

Das Verhalten zeigte nachdem ich in Windows ein Programm in den Chip schießen wollte.
Im Normalfall nehme ich avrdude in Linux dazu.

Komme ich da mit dem usbasp ran ? :confused:

Nochmal Danke ! Gruß
Ralf
 
Zu den I/Os schau mal ins Datenblatt des Controllers. Diesbezüglich gibt es für jedes Beinchen 2 Bits, mit denen einer der 4 möglichen Zustände ausgewählt wird. Diese Bits sind dann für einen ganzen Port in einem Register vereint (A, B, C usw).
Einerseits hat man das Datenrichtungsregister - steht da im entsprechenden Bit des Beinchens eine 1, werden dessen Ausgangstreiber aktiviert (deswegen also Ausgang), wenn nicht, dann ncht (Eingang). Wenn das Bein Ausgang ist, legt das entsprechende Bit im PORT-Register den Pegel fest (1=Hi, 0=Lo). Ist da Datenrichtungsregister-Bit=0, ist das Bein erstmal Tristate. es ist jedoch permanent mit einem Pullup verbunden. Dieser Pullup wird über einen Transistor/FET/etc auf Vcc gelegt, Die Ansteuerung erfolgt über ein AND-Gatter, in welches das PORT-Bit und (negiert) das DDR-Bit eingehen.
Wie gesagt, in den Datenblättern ist immer bei General Digital I/O ein Schema dazu.
(Außerdem können alle Pullups global durch ein Pullup-Disable-Bit ausgeschaltet werden (egal, was der PORT da sagt) - eben auch über das AND-Gatter. Wenn der Pin jetzt noch an Hardware gekoppelt werden kann (und somit von der digitalen I/O abgetrennt), wirds etwas komplizierter - aber auch dazu gibts 'n Schema.
 
Hallo Ralf,

Das andere ist die Geschichte mit den Pull-Ups.
Verstehe ist das richtig ?
Wenn der Ausgang auf 1 ist schaltet der Ausgangs-
transistor auf Masse, d.h. Spannung gleich 0.
Also Open-Kollektor ?

sieh mal hier im Forum in die FAQs. Da steht das sogar für C drin wenn ich mich recht entsinne.
Und ich habs nochmal ganz genau mit innerer Hardware erklärt.

Gruß
Dino
 
moin moin,
Danke nochmal für die Hilfe !!!
So die PWM läuft, sogar mit Regelung.
Nun kam heute noch eine 8-stellige 7-Segment-Anzeige mit 74hc595 und ich falle so langsam vom Glauben ab.
PWM und Timer 1 h -> 7-Segment-Anzeige 12 h, kein Ergebnis.
Das Gerät hat 3 Dateneingänge: SCK, RCK und dio.
Übertragen auf das Manual des ics lauten diese wohl:
DS Dateneingang, SCK (SHCP) und RCK (STCP).
Die Anzeige scheint aber intakt. Ich kann durch direkte Einspeisung an den Pins Änderungen des
Ausgangszustände beobachten.
Für mein Verständnis bräuchte ich gemäß dem PDF noch andere Eingänge, aber die gibt es auf der Platine nicht.
Hat jemand vielleicht einen C-Code für das Ding ?
Meine Ideen traue ich mich nicht hochzuladen, da sich nix tut.
Oder etwas zur Aufmunterung ?
5 Uhr, könnt' mal Schlafen gehen. ;-)
Gruß
Ralf
 
Ganz vergessen...
Mit dem Display wurde ein Basic-Code mitgeliefert.
Was macht denn der Basic-Befehl ?
/*
Shiftout Daten , Clk , T , 0 , 16 , 100
*/
Den Rest des Programms lade ich später hoch, muß erst die
Email wiederfinden. Wobei der eingentlich klar war. Die oben aufgeführte Zeile hatte ich in meinen C-Code als Kommentar reinkopiert.
Clk und T entsprechen wohl DS(Daten) und Schieben SHCP.
Gruß
Ralf
P.S
Bin ja völlig Off-Topic...sollte ja nur eine kurze Frage werden... Culpa mea
 
...Mit dem Display wurde ein Basic-Code mitgeliefert.
Was macht denn der Basic-Befehl ?
/*
Shiftout Daten , Clk , T , 0 , 16 , 100
*/

Hallo Ralf,

Informationen zu Shiftout findest du hier:
http://avrhelp.mcselec.com/index.html?shiftout.htm

Wegen dem Display mit 74HC595 ...

DS: Dateneingang
SCK (SHCP, Shift Clock Pulse?!): wird der Shift Clock sein, mit dem die Bits reingetaktet werden.
RCK (STCP, Store Clock Pulse?!): wird der Register Clock sein, mit dem die Daten ins Output Latch übernommen werden.

Zuerst taktest du alle Datenbits rein (DS, SCK). Die Anzahl ist abhängig vom Display (es ist möglich merhere 74HC595 hintereinander zu schalten, wird bei dir sicherlich auch so sein).
Wenn alles Datenbits richtig in den Shiftregistern sind, taktest du mit RCK den Inhalt der Shiftregister in die Output Latches.


Dirk :ciao:

---

OT, vielleicht aber in dem Zusammenhang interessant: für Anwendungen mit LED-7Segment-Anzeigen werden bei uns im Shop sehr gerne die Displays von Adafruit mit I2C gekauft:



Dafür habe ich ein C-Beispiel (basiert auf Adafruits Arduino-Lösung) geschrieben, dies findet man in meinem Blog:
Atmel Studio C Library für Seven Segment LED Backpack

Wenn man sich selber LED-Anzeigen bauen möchte, haben wir auch den bei diesen Displays verwendeten Controller HT16K33 (SO28) auf Lager.
 
Hmm... der 74hc595 ist doch sowas wie ein 8bit seriell zu parallel Wandler (gelatchtes 8bit Schieberegister). Willst Du mehrere Ziffern kaskadieren? Warum kein BCD zu 7-Segment-IC, wie zB den 74hc48?

Und wenn's unbedingt seriell zu ... bleiben soll, gäbe es zumindest in der 4000er Serie auch entsprechende Zählsteine (dezimal zu 7-Segment), zB den 4026 oder den 4033.
 
Hallo LotadaC,
Warum kein BCD zu 7-Segment-IC, wie zB den 74hc48?

weil es sicherlich ein fertiges Displaymodul mit 74HC595 ist. (Mit einem reinen BCD-nach-7Segment Dekoder wäre man auch ziemlich an die Dekodierung gebunden, sowas hat man früher eingesetzt. Wobei ich die 74HC595 Lösung ebenfalls "veraltet" finde, habe ich aber auch selber schon eingesetzt, da es billiger fast nicht geht, wenn es seriell sein muss.)

Dirk :ciao:
 
So... die Anzeige funktioniert ! Sie zählt vorwärts und rückwärts... beim Rückwärtszählen wird die 1 verschluckt... :dance3: Aber egal...
Super Sache... das Muster besteht aus 16 Bit. Die ersten 8 bestimmen welches Digit angesteuert wird.
Und alle haben eine gemeinsame Anode... das war natürlich mein Problem, ging ich von gem. Kathode aus.
So musste ich alle Bit invertieren. Gruß Ralf
P.S
Das nächste Problem habe ich gerade veröffentlich, die serielle Schnittstelle
 
Hallo alle zusammen,
leider komme ich derzeit recht wenig zum Avr-Programmieren.
Aber gerade stehe ich mal wieder völlig auf der Leitung.
Nun habe ich einen Zähler mit einer 8-Stelligen 7-Segment-Anzeige realisiert.
Als Treiber ist der 595 eingebaut.
Mein Problem ist, dass immer nur eine Anzeige aktiviert ist.
Kann ich mehrere zeitgleich aktivieren ?
Oder geht dies nur quasi zeitgleich ?
Kam gestern am Butzbacher Bahnhof drauf. Dort starrte ich auf einen defekten Automaten. 4 7-Segment-Anzeigen flackerten, wie von Sinnen, aber nicht zeitgleich.
Da wurde ich "neidisch" da bei mir immer nur eine leuchtet. :rolleyes:

Viele Grüsse
Ralf
Kurzum: Ich brauch' ein Display.
 
Hallo Ralf,

Nun habe ich einen Zähler mit einer 8-Stelligen 7-Segment-Anzeige realisiert.
Als Treiber ist der 595 eingebaut.
Mein Problem ist, dass immer nur eine Anzeige aktiviert ist.
Kann ich mehrere zeitgleich aktivieren ?
Oder geht dies nur quasi zeitgleich ?
Kam gestern am Butzbacher Bahnhof drauf. Dort starrte ich auf einen defekten Automaten. 4 7-Segment-Anzeigen flackerten, wie von Sinnen, aber nicht zeitgleich.
Da wurde ich "neidisch" da bei mir immer nur eine leuchtet. :rolleyes:

1. der 595 ist kein "Treiber" sondern ein Schieberegister. Vergleichbar ner Eimerkette bei der Feuerwehr (wobei die alten Eimerkettenspeicher analog waren => Halleffekt).

2. Such mal nach Multiplex-Anzeige oder Multiplex-Betrieb oder sowas. Das ist dann quasi gleichzeitig.

3. Nen Schaltplan wäre interessant um mehr dazu sagen zu können.

Gruß
Dino
 
Hallo Ralf,



1. der 595 ist kein "Treiber" sondern ein Schieberegister. Vergleichbar ner Eimerkette bei der Feuerwehr (wobei die alten Eimerkettenspeicher analog waren => Halleffekt).

2. Such mal nach Multiplex-Anzeige oder Multiplex-Betrieb oder sowas. Das ist dann quasi gleichzeitig.

3. Nen Schaltplan wäre interessant um mehr dazu sagen zu können.

Gruß
Dino

Hallo Dino,
Schaltplan habe ich hier.
Gruß
RalfSchalt.jpg
 
Hi Ralf,

ich hab den Schaltplan mal etwas größer gesetzt.
Also zweimal 595 in Reihe. Ich hoffe mal das in der wirklichen Schaltung Widerstände in den Segmentleitungen drin sind.
Dann noch ... 8 Displays auf einem 595-Ausgang :rolleyes: :p finde ich echt mutig :eek: :flute:
Hast du dir schonmal angesehen wieviel mA so ein Ausgang verkraftet? Wenn du zB von einer Stellen alle Segmente an hast, dann muß der Ausgang 8 LEDs treiben. Also 20mA darfst du da auf keinen Fall durch eine LED schicken. Das wären dann 160mA auf dem einen Pin für das Display. Da solltest du mal überlegen ob du zwischen die Displays (D1-8) und dem zugehörigen 595 nicht nen Treiber setzt (zB ULN2803 oder sowas). Wenn du beim Multiplexbetrieb dann richtig loslegst mußt mit höheren Strömen fahren um noch was zu sehen. Bei 8 Dispalys arbeitest du ja mit 1/8 DutyCycle. Also wie bei PWM auf 12,5% Leistung.

EDIT: Hab mal nachgesehen. Absolute Maximum Ratings für die Bus-Ausgänge Q0..7 sind 35mA (Sink/Source). Ab da glühen dir die Dinger von der Platine. Die normalen Ausgänge haben 25mA max.

Gruß
Dino
 
Hi Ralf,

ich hab den Schaltplan mal etwas größer gesetzt.

Also zweimal 595 in Reihe. Ich hoffe mal das in der wirklichen Schaltung Widerstände in den Segmentleitungen drin sind.
Dann noch ... 8 Displays auf einem 595-Ausgang :rolleyes: :p finde ich echt mutig :eek: :flute:
Hast du dir schonmal angesehen wieviel mA so ein Ausgang verkraftet? Wenn du zB von einer Stellen alle Segmente an hast, dann muß der Ausgang 8 LEDs treiben. Also 20mA darfst du da auf keinen Fall durch eine LED schicken. Das wären dann 160mA auf dem einen Pin für das Display. Da solltest du mal überlegen ob du zwischen die Displays (D1-8) und dem zugehörigen 595 nicht nen Treiber setzt (zB ULN2803 oder sowas). Wenn du beim Multiplexbetrieb dann richtig loslegst mußt mit höheren Strömen fahren um noch was zu sehen. Bei 8 Dispalys arbeitest du ja mit 1/8 DutyCycle. Also wie bei PWM auf 12,5% Leistung.

EDIT: Hab mal nachgesehen. Absolute Maximum Ratings für die Bus-Ausgänge Q0..7 sind 35mA (Sink/Source). Ab da glühen dir die Dinger von der Platine. Die normalen Ausgänge haben 25mA max.

Gruß
Dino

Hallo Dino,
das ist eine komplette Platine aus China. Die können so etwas. :sarcastic:
Ich schaue derzeit mit gemischten Gefühlen auf das Amperemeter meines schnuckeligen Netzteils.
Beim Erleuchten einer Ziffer springt der Zeiger doch deutlich.
3 Avrs und 1x Rs-232-Converter schlucken weniger als eine Anzeige.
Gut, es ist für den stationären Betrieb.
Aber vielleicht wäre ein LCD-Display doch günstiger.
Gibt es da etwas mit weniger Programmier-Eigentinitiative ?
Gruß
Ralf
Low-Current-Leds sind das scheinbar auch nicht.
 
Schnell und einfach geht es mit der Lösung im Beitrag 8 dieses Themas unter Off topic.

Alleine das layout ist sicher bei acht Siebensegmentanzeigen recht kompliziert.:)
 
Schnell und einfach geht es mit der Lösung im Beitrag 8 dieses Themas unter Off topic.

Alleine das layout ist sicher bei acht Siebensegmentanzeigen recht kompliziert.:)

Hallo Dirk,
so ein Teil würde ich nehmen. Ach, fällt mir gerade eine... ein SD-Karten-Leser für 5 V wollte ich auch noch.
Falls möglich würde ich die Teile persönlich abholen, liegt ja bei mir auf'em Weg.
Gruß
Ralf
 
Hallo Ralf,
so ein Teil würde ich nehmen. Ach, fällt mir gerade eine... ein SD-Karten-Leser für 5 V wollte ich auch noch.
Falls möglich würde ich die Teile persönlich abholen, liegt ja bei mir auf'em Weg.

ja, das kann man machen, du hast dazu eine PN.

Dirk :ciao:

EDIT:
Da es hier gerade passt:

Für diejenigen, die sich gerne eigene LED Anzeigen (oder auch Taster) an den Holtek HT16K33 Controller anschließen möchten, gibt es Anfang nächster Woche dafür ein Adafruit Breakout Board im Shop.

AF1427a.jpg
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)