Forum: Mikrocontroller und Digitale Elektronik Atmega32 Taktproblem


von Andre (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Sieh dir das Assemblerlisting an. Da wirst du feststellen, das da nicht 
nur ein Befehl ist.

MfG Spess

von Sam .. (sam1994)


Lesenswert?

Das liegt daran, dass für deinen C-code mehrere Asm-Befehle gebraucht 
werden.
Wie der Code übersetzt wurde steht in der *.lss datei.

von holger (Gast)


Lesenswert?

>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.

von Andre (Gast)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

von holger (Gast)


Lesenswert?

>ist ja nur ein simples 16x2 display.

Welches? Vieleicht braucht das Teil ja eine
negative Kontrastspannung.

von spess53 (Gast)


Lesenswert?

Hi

>Also in 4 Sollte C das doch auch hinbekommen.

Eher Glückssache. Dann lieber gleich Assembler.

MfG Spess

von Sam .. (sam1994)


Lesenswert?

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>

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Sam .. (sam1994)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.