Hallo zusammen Ich hoffe, ihr könnt mir weiterhelfen. Ich habe ein AVR Board von Pollin welcher mit einem Atmega32 läuft. Dieser wird extern versorgt durch einen 16MHZ Quarzoszillator. Die Fusebits habe ich so gestellt, dass er den externen Oszillator mit hoher Frequenz wählt. In C habe ich folgendes Programm geschrieben: int main(void){ DDRD = 0xFF; PORTD = 0xFF; while(1){ PORTD = ~PORTD;} return 0;} Dieses Programm ist eigentlich dazu da, den Takt zu messen. Schliesse ich nun ein Oszilliskop an den ausgang an, wird mir eine Frequenz von 1,6 MHZ angezeigt??? Eigentlich versuche ich die ganze Zeit, ein LCD-Display anzuschließen. Anscheinend funktioniert aber der Takt nicht richtig. Wähle ich über die FUSE-Bits einen internen Takt von 1 MHZ dann messe ich mit obigem Programm 100 kHz?!? Vorab vielen Dank für eure Hilfe! Gruß Andre
Hi Sieh dir das Assemblerlisting an. Da wirst du feststellen, das da nicht nur ein Befehl ist. MfG Spess
Das liegt daran, dass für deinen C-code mehrere Asm-Befehle gebraucht werden. Wie der Code übersetzt wurde steht in der *.lss datei.
>Dieses Programm ist eigentlich dazu da, den Takt zu messen. Schliesse >ich nun ein Oszilliskop an den ausgang an, wird mir eine Frequenz von >1,6 MHZ angezeigt??? Fünf Takte für einen Schleifendurchlauf finde ich ist ok.
Erstmal danke für die Antworten. Ja sowas habe ich schon vermutet. Hab zuerst an Clkdiv gedacht aber das ist ja eher bei den kleineren atmegas der fall. ich frag mich nur wieso das display zum teufel nicht laufen will. hab etliche programme selber geschrieben und einige kopiert. auch die hier beschriebenen. ist ja nur ein simples 16x2 display. klappt weder im 4 bit noch im 8 bit modus.
holger schrieb: > Fünf Takte für einen Schleifendurchlauf finde ich ist ok. Also in 4 Sollte C das doch auch hinbekommen. L1: com r16 out PORTD, r16 rjmp L1 oder mit 3: ldi r16, 0xFF ldi r17, 0x00 L1: out PORTD, r16 rjmp L2 L2: out PORTD r17 rjmp L1
>ich frag mich nur wieso das display zum teufel nicht laufen will. hab >etliche programme selber geschrieben und einige kopiert. auch die hier >beschriebenen. ist ja nur ein simples 16x2 display. klappt weder im 4 >bit noch im 8 bit modus. Falsch angeschlossen? Dann kannst du noch so viel Software ausprobieren.
>ist ja nur ein simples 16x2 display.
Welches? Vieleicht braucht das Teil ja eine
negative Kontrastspannung.
Hi
>Also in 4 Sollte C das doch auch hinbekommen.
Eher Glückssache. Dann lieber gleich Assembler.
MfG Spess
spess53 schrieb: > Eher Glückssache. Dann lieber gleich Assembler. > > MfG Spess ich weiß jetzt warum der das nicht kapiert: PORTD ist für ihn volatile. Deswegen wird der Port immer ausgelesen:
1 | PORTD = ~PORTD; |
2 | 3c: 82 b3 in r24, 0x12 ; 18 |
3 | 3e: 80 95 com r24 |
4 | 40: 82 bb out 0x12, r24 ; 18 |
5 | 42: fc cf rjmp .-8 ; 0x3c <main+0x4> |
Samuel K. schrieb: > holger schrieb: >> Fünf Takte für einen Schleifendurchlauf finde ich ist ok. > > Also in 4 Sollte C das doch auch hinbekommen. ungetestet
1 | int main(void) |
2 | {
|
3 | uint8_t value; |
4 | |
5 | DDRD = 0xFF; |
6 | PORTD = 0xFF; |
7 | |
8 | while(1) { |
9 | PORTD = value = ~value; |
10 | }
|
11 | |
12 | return 0; |
13 | }
|
Respekt, das frisst er und macht tatsächlich 4 Takte daraus. Es reicht also die temporäre Variable zu deklarieren. Andre schrieb: > Dieses Programm ist eigentlich dazu da, den Takt zu messen. Schliesse > ich nun ein Oszilliskop an den ausgang an, wird mir eine Frequenz von > 1,6 MHZ angezeigt??? Es gibt übrigens bei den neueren Avrs die CKOUT-Fuse, welche an einem Pin den Takt ausgeben lässt.
>Respekt, das frisst er und macht tatsächlich 4 Takte daraus. Es reicht >also die temporäre Variable zu deklarieren. Zu deklarieren wohl nicht, aber sie zu benutzen. Mit volatilen Variablen rechnen bringt immer viel Overhead. Also schön immer erst in temporäre Variable kopieren, dann damit rechnen und wenn erforderlich in die volatile zurückkopieren.
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.