Verwendet wird ein ATmega 88 MikroController der Firma Atmel. Dieser wurde mit Hilfe des mySmartUSB-lite ISP-Programmers beschireben. Das Beschreiben des MikroControllers funktionier einwandfrei. Der unten stehende Text wurde in den Controller geladen. Der MikroController besitzt eine externe Spannungsversorgung (nicht über USB) Code: ______________________________________________________________________ //Bibliotheken laden: #define F_CPU 8000000 #include <avr/io.h> #include <avr/delay.h> //Pinmethoden definieren: #define pin_ein(PORTx,pin) ((PORTx) |= (1<<pin)) #define pin_aus(PORTx,pin) ((PORTx) &= ~(1<<pin)) #define pin_toggeln(PORTx,pin) ((PORTx) ^= (1<<pin)) #define pin_lesen(PINx,pin) ((PINx) & (1<<pin)) int main(void) { //Parameterliste: unsigned int i; unsigned int j; //Ausgänge definiernen: DDRC |= ((1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)); // PC5 = Reset ; // PC1= Serieller Eingang ; // PC2 = Ausgangssteuerung ; // PC3 = Speichertakt ; // PC4 = Schiebetakt ; while (1) { for(i = 0 ; i < 9; i++) { pin_ein(PORTC,PC2); //Ausgänge deaktivieren. pin_aus(PORTC,PC5); //RESET beginnen pin_ein(PORTC,PC5); //RESET beenden pin_ein(PORTC,PC1); //Seriellen Eingang auf Eins for (j=0;j<=i;j++) { pin_ein(PORTC,PC4); //Schiebetakt aktivieren pin_aus(PORTC,PC4); //Schiebetakt reserten pin_aus(PORTC,PC1); //Seriellen Eingang auf dig. Null } pin_ein(PORTC,PC3); //Speichertakt aktivieren. pin_aus(PORTC,PC3); //speichern. pin_aus(PORTC,PC2); //Ausgänge reaktivieren. } } } ______________________________________________________________________ _ Ziel: An dem Schieberegister ist an jedem der acht Ausgänge eine LED mit entsprechenden Vorwiderstand angebracht. Der MikroController soll diese 8 LEDs nacheinander ein- und wieder ausschalten, und dies in einer Endlosschleife. Problem: Wenn ich das Programm auf den MikroController lade leuchten kurz alle LEDs auf. Ist das Programm auf den Flash-Speicher geladen, leuchtet jedoch keine LED und die Steueranschlüsse des Schaltregisters sind entsprechend des oben angeführten Quellcodes beschalten. Frage: Kann es sein, dass das Schaltregister die positiven Flanken an den Steueranschlüssen nicht wahrnimmt? Bzw. habe ich etwas in der Programmierung falschgemacht? Wäre für jede Hilfe sehr dankbar. Vielen Dank im Voraus
:
Verschoben durch Moderator
Lucas P. schrieb: > Verwendet wird ein ATmega 88 MikroController der Firma Atmel. Lucas P. schrieb: > Der unten stehende Text wurde in den Controller geladen. Warum schreibst du in der "dritten Person"? Ist noch jemand beteiligt? Oder traust du dir nicht zu sagen dass du derjenige bist der das tut oder getan hat? Oder bist du aus adeligem Haus wo nur in der dritten Person gesprochen wird? Vielleicht ist die andere Person dein zweites Ich.
Lucas P. schrieb: > //Bibliotheken laden: Das sind keine Bibliotheken sondern Header Files Lucas P. schrieb: > //Pinmethoden definieren: Das sind keine Pinmethoden sondern Makros Lucas P. schrieb: > //Parameterliste: Das sind keine Parameter sondern Variablen Lucas P. schrieb: > Schieberegister mit Atmega88 Schaltpläne in Prosa sind scheisse. Du gibst nicht einmal an welches Schieberegister du verwendest. Zeige einen vollständigen Schaltplan.
Das Ganze läuft in einer affenartigen Geschwindigkeit durch. Dabei sind die Ausgänge die meiste Zeit deaktiviert. Wenn man von 0...8 zählt, zählt man 9 Mal.
1 | > for (i = 0 ; i < 9; i++) |
@ fop: vielen dank. Das habe ich vermutet, wie verringere ich die Geschwindigkeit des Ablaufs? Außer mit _delay_ms() zu arbeiten. Theoretisch könnte ich die F_CPU verringern, ist dies unbegrenzt möglich?
Standardmäßig takten alle AVR's mit 1 oder 1,2 Mhz was für die üblichen Schieberegister in Ordnung ist. Statt _delay_ms() kannst duch auch _delay_us() benutzen oder für sehr kurze Verzögerungen den Assembler Befehl "NOP" einbetten (das ist aber nicht ganz so einfach). Aber es geht hier ja nicht nur um die Frequenz, die das Schieberegister "schafft", sondern auch um deine Augen. Das ganz muss ja langsam genug ablaufen, damit man auch etwas sehen kann. > Theoretisch könnte ich die F_CPU verringern, ist dies unbegrenzt möglich? Prinzipiell ja, aber vermutlich nicht so, wie Du es Dir gerade vorstellst. F_CPU verändert nicht die Taktfrequenz sondern muss der Taktfrequenz entsprechen, damit die _delay_xx() Funktionen tun, was sie sollen. Wenn du die CKDIV8 Fuse nicht verändert hast, läuft dein Controller mit 1Mhz, nicht mit 8Mhz. Lies mal im Datenblatt die Kapitel "System Clock and Clock Option", sowie "Clock Prescale Register" und "Fuse Low Byte" durch. Zeichne einen Schaltplan. Danach melde dich nochmal.
Anbei ist eine skizze von den beiden Bauteilen. Warauf soll ich in den besagtenKapiteln besonders achten?
Da fehlen Abblock-Kondensatoren. Ich bezweifle, dass du so viele Signal-Leitungen zwischen µC und Schieberegister benötigst.
Ich habe den Aufbau entsprechend dem AVR_Tutorial gemacht. Hier sind auch keine Kondensatoren eingebaut. Grundsätzlich ist es doch egal welche Pins ich am Mikrocontroller verwende um die Steueranschlüsse am Schieberegister anzusteuern, oder? Ich habe mich für PC1-PC5 entschieden. Bei diesen ist weder ein MISO , MOSI; SCK dabei, da ich diese schon für ISP-Programmer verwendet habe, wollte ich die Schieberegister der Sauberkeit halber mit einem anderen Port ansteuern. Da ich leider kein Assembler kann, kann ich mit dem Quell-Code in der AVR-Anleitung leider wenig anfangen. Da die Applikation des Schieberegisters - abgesehen von den verwendeten Pins - der des AVR-Tutorials entspricht, hatte ich eben den Verdacht das ich mit der Software einen Fehler gemacht habe. Habe ich eventuell irgendwelche Headerdateien, etc vergessen?
> Ich habe den Aufbau entsprechend dem AVR_Tutorial gemacht. Mir egal, es ist falsch. Gerade Schieberegister und Mikrocontroller benötigen Abblock-Kondensatoren, um zuverlässig zu funktionieren. > hatte ich eben den Verdacht das > ich mit der Software einen Fehler gemacht habe. Wenn du mir nicht glaubst, kannst du ja alleine weiter suchen. Du hast die Qual der Wahl. Ohne Abblock-Kondensatoren helfe ich Dir nicht weiter. Hast du dein Programm inzwischen entsprechend unserer Ratschläge korrigiert? Zeitg mal, wie es jetzt aussieht.
L_P schrieb: > Ich habe den Aufbau entsprechend dem AVR_Tutorial gemacht. Hier sind > auch keine Kondensatoren eingebaut. Streite doch nicht, mache welche dran. Damit schließt Du schon eine Fehlerquelle aus. Du mußt doch nicht die Fehler wiederholen, mit denen schon etliche Andere auf die Schnauze gefallen sind. Abel
L_P schrieb: > Ich habe den Aufbau entsprechend dem AVR_Tutorial gemacht. Hier sind > auch keine Kondensatoren eingebaut. Bei Bohrmaschinen steht auch nicht ausdrücklich in der Bedienungsanleitung, dass man sich damit besser nicht in den Augen bohrt. Es wird einfach erwartet, dass jeder allein erkennt, was gut für ihn ist... > Grundsätzlich ist es doch egal > welche Pins ich am Mikrocontroller verwende um die Steueranschlüsse am > Schieberegister anzusteuern, oder? Kommt drauf an. Nicht jeder Pin ist unter jedem Aspekt mit jedem anderen einfach austauschbar. Im konkreten Fall (Mega88) sollte es allerdings keine besonderen Probleme bei der Verwendung von PC1..PC5 geben, bei den größeren Megas sähe das aber schon wieder anders aus. > Da ich leider kein Assembler kann, kann ich mit dem Quell-Code in der > AVR-Anleitung leider wenig anfangen. Dann musst du es lernen. AVR-Assembler ist eine sehr einfache Sprache mit sehr simplen Regeln und einer sehr überschaubaren Vielfalt möglicher Anweisungen. > Da die Applikation des Schieberegisters - abgesehen von den verwendeten > Pins - der des AVR-Tutorials entspricht, hatte ich eben den Verdacht das > ich mit der Software einen Fehler gemacht habe. Entweder dort oder bei der Hardware. So einfach ist es eigentlich immer. Der Trick beim µC-Programmieren ist: selber herausfinden zu können, wo genau der Fehler steckt... Wer das nicht kann, ist unfähig und muss einfach noch etwas mehr lernen...
Hast du eigentlich einen Debugger (Dragon oder ICE)? Der wäre jetzt sehr hilfreich. Wenn nicht, dann lass das Programm einfach mal im Simulator laufen und schaue, ob die Bits von Port C sich wirklich so verhalten, wie du es erwartet hast.
Frage1: Welche Kapazität benötigt der Abblockkondensator? Setze ich die Kondensatoren parallel zum Mikrocontroller und zu dem Schieberegister? Frage2: Ich verwende ATMEL Studio 7 aber ich habe keine Ahnung wie ich den Simmulator benutze. An der Software habe ich momentan noch nichts gemacht. Wollte erstmal abwarten was Hardwaremäßig noch alles kommt.
Grundsatz Nummer 1: Jedes IC bekommt immer einen 100nF Kondensator möglichst nahe an den VCC und GND Pins des IC. Es sei denn, du hast einen fundierten wichtigen Grudn dagegen. Für den Simulator gibt es bei Youtube ein Video. Oder klick dich einfach durch, du findest es bestimmt an einem Abend heraus. by the way: Wenn du den Simulator bedienen gelernt hast, kannst du auch mit einem Hardware Debugger umgehen. Der Unterschied ist, dass das Programm dan in der echten Hardware Schritt für Schritt ausgeführt wird, so daß du das Ergebnis direkt auf den LED's sehen kannst. Und du kannst Dir alle Variablen anschauen. Ich warte noch auf deinen aktuellen Quelltext. > Wollte erstmal abwarten was Hardwaremäßig noch alles kommt. Was wenig Sinn macht, da ja längst klar ist, daß dein Programm grobe Fehler hat, vor allem fehlende Delays.
Die Videos habe ich gesehen und gehe gerade den Code durch. Meine Frage zu den Delays: Momentan habe ich nur einen ca 60000 ms delay nach reaktivieren der Ausgänge, reicht das nicht? sonst unverändert.
Dein Schieberegister würde die 8Mhz locker mit machen. Du musst dur dafür sorgen, daß die LED's lange genug leuchten, damit es etwas zu sehen gibt. 60000ms ist eine ganze Minute, das kann nur ein Irrtum sein, oder? Wobei mich hier so ein komische Gefühl im Nacken kitzelt. Frage: Wie lang darf der Delay maximal sein? Sicher gibt es Grenzen, wenn du die überschreitest, kommt etwas zufälliges dabei heraus. Was sagt die Doku zum _delay_ms() Befehl?
//Bibliotheken laden: #define F_CPU 8000000 #include <avr/io.h> #include <avr/delay.h> //Pinmethoden definieren: #define pin_ein(PORTx,pin) ((PORTx) |= (1<<pin)) #define pin_aus(PORTx,pin) ((PORTx) &= ~(1<<pin)) #define pin_toggeln(PORTx,pin) ((PORTx) ^= (1<<pin)) #define pin_lesen(PINx,pin) ((PINx) & (1<<pin)) int main(void) { //Parameterliste: unsigned int i; unsigned int j; //Ausgänge definiernen: DDRC |= ((1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)); // PC5 = Reset ; // PC1= Serieller Eingang ; // PC2 = Ausgangssteuerung ; // PC3 = Speichertakt ; // PC4 = Schiebetakt ; while (1) { for(i = 0 ; i < 8; i++) { //pin_ein(PORTC,PC2); //Ausgänge deaktivieren. pin_aus(PORTC,PC2); //Ausgänge reaktivieren. pin_aus(PORTC,PC5); //RESET beginnen pin_ein(PORTC,PC5); //RESET beenden pin_ein(PORTC,PC1); //Seriellen Eingang auf Eins //for (j=0;j<=i;j++) //{ pin_ein(PORTC,PC4); //Schiebetakt aktivieren pin_aus(PORTC,PC4); //Schiebetakt reserten //pin_aus(PORTC,PC1); //Seriellen Eingang auf dig. Null //} pin_ein(PORTC,PC3); //Speichertakt aktivieren. pin_aus(PORTC,PC3); //speichern. pin_aus(PORTC,PC2); //Ausgänge reaktivieren. _delay_ms(60000); //Wartezeit = 1 min } i=0; } }
Rpcke das doch mal anständig ein und benutze die Tags für Quelltexte, damit man das auch lesen kann!
1 | //Bibliotheken laden:
|
2 | #define F_CPU 8000000
|
3 | #include <avr/io.h> |
4 | #include <avr/delay.h> |
5 | |
6 | //Pinmethoden definieren:
|
7 | #define pin_ein(PORTx,pin) ((PORTx) |= (1<<pin))
|
8 | #define pin_aus(PORTx,pin) ((PORTx) &= ~(1<<pin))
|
9 | #define pin_toggeln(PORTx,pin) ((PORTx) ^= (1<<pin))
|
10 | #define pin_lesen(PINx,pin) ((PINx) & (1<<pin))
|
11 | |
12 | int main(void) |
13 | {
|
14 | //Parameterliste:
|
15 | unsigned int i; |
16 | unsigned int j; |
17 | |
18 | //Ausgänge definiernen:
|
19 | DDRC |= ((1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)); |
20 | // PC5 = Reset ;
|
21 | // PC1= Serieller Eingang ;
|
22 | // PC2 = Ausgangssteuerung ;
|
23 | // PC3 = Speichertakt ;
|
24 | // PC4 = Schiebetakt ;
|
25 | |
26 | while (1) |
27 | {
|
28 | for(i = 0 ; i < 8; i++) |
29 | {
|
30 | //pin_ein(PORTC,PC2); //Ausgänge deaktivieren.
|
31 | pin_aus(PORTC,PC2); //Ausgänge reaktivieren. |
32 | pin_aus(PORTC,PC5); //RESET beginnen |
33 | pin_ein(PORTC,PC5); //RESET beenden |
34 | pin_ein(PORTC,PC1); //Seriellen Eingang auf Eins |
35 | //for (j=0;j<=i;j++)
|
36 | //{
|
37 | pin_ein(PORTC,PC4); //Schiebetakt aktivieren |
38 | pin_aus(PORTC,PC4); //Schiebetakt reserten |
39 | |
40 | //pin_aus(PORTC,PC1); //Seriellen Eingang auf dig. Null
|
41 | //}
|
42 | pin_ein(PORTC,PC3); //Speichertakt aktivieren. |
43 | pin_aus(PORTC,PC3); //speichern. |
44 | pin_aus(PORTC,PC2); //Ausgänge reaktivieren. |
45 | _delay_ms(60000); //Wartezeit = 1 min |
46 | }
|
47 | i=0; |
48 | }
|
49 | }
|
Was habe ich zur Delay Zeit geschrieben? Du bekommst jetzt einen symbolischen Schlag in den Nacken von Papa!
Die Minute war eigentlich gewollt.Wenn ich den Delay aus kommentiere, dann läuft das Programm ohne Probleme durch, ab einem delay von über 200 MS steigt der Simulator aus. Also wäre das weitere Vorgehen, den 100nF Abblockkondensatoren am MikroController anzubringen und dann einen Hardwaredebugging-Durchgang zu machen ? Ist der Atmel Studio Debugger auch als Hardware Debugger verwendbar oder muss man hierzu andere Software beschaffen.
Lucas P. schrieb: > for(i = 0 ; i < 8; i++) > { > //pin_ein(PORTC,PC2); //Ausgänge deaktivieren. > pin_aus(PORTC,PC2); //Ausgänge reaktivieren. > pin_aus(PORTC,PC5); //RESET beginnen > pin_ein(PORTC,PC5); //RESET beenden .. Guck mal nach dem Timing und Takte, Seite 7 und 8: http://www.ti.com/lit/ds/symlink/sn74hc595.pdf
Den Delay kannst du nicht sinnvoll simulieren, weil der Simulator viel langsamer läuft, als der echte µC. Im Simulator würde ich die Delays auskommentieren und das Programm stattdessen Zeile für Zeile nach Tastendruck abarbeiten. Nächste Schritte: 100nF Kondensatoren hinzufügen Delay nicht länger als erlaubt machen Sich mit dem Simulator vertraut machen Lernen, wie das mit den FUSES geht und entweder die Fuse für den Clock Prescaler richtig einstellen oder die F_CPU Angabe auf 1Mhz korrigieren. Des weiteren würde ich das Programm weiter ausdünnen, solange es nicht tut, was es soll. Die beiden Leitungen /OE (Ausgangsteuerung) und /MR (Reset) von Schieberegister würde ich ganz am Anfange des Programmes auf High setzen und dann nicht mehr ändern. Beschränke deine ersten Schritte auf die Nutzung der beiden Taktleitungen und den seriellen Daten. Takte einfach immer abwechslend eine "1" und eine "0" in das Schieberegister, dann müsste jede zweite LED leuchten. Und denke mal drüber nach, wozu das i=0 am Ende (nicht) gut ist. Hardware Debugger ist ein optionaler Luxus. Dafür wirst du mindestens 50 Euro ausgeben müssen. Lass das erstmal. > Ist der Atmel Studio Debugger auch als Hardware Debugger verwendbar Ja, aber du brauchst dazu ein Gerät (Atmel ICE für Atmel Studio 7, oder Dragon für AVR Studio 4 unter Windows XP oder Windows 7).
Stefan U. schrieb: > a, aber du brauchst dazu ein Gerät (Atmel ICE für Atmel Studio 7, oder > Dragon für AVR Studio 4 unter Windows XP oder Windows 7). Wäre das ok? http://www.watterott.com/de/Atmel-ICE-Debugger-PCBA-only
Hi >Wäre das ok? >http://www.watterott.com/de/Atmel-ICE-Debugger-PCBA-only Jain. Beachte bitte, das da keine Kabel dabei sind. Die Pfostenverbinder haben ein Rastermaß von 1,27 mm, also halb so groß wie üblich. Also mach dich bei den üblichen Verdächtigen über Kabel/Steckverbinder schlau. MfG Spess
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.