Constante in If-Anweisung geht nicht?

#557861
Lesenswert?

Hallo,

habe folgendes Problem:

Ich definiere eine Konstante und Variable:
1
const StartFrame = 10101100b
2
dim RxByte as Byte

und lege die Interrupt-Routine Fest:
1
on URxC _URxC_ISR
2
Enable URxC
3
Enable Interrupts
4

5
Do
6
 NOP
7
Loop
8

9
' Interrupt-Routine
10

11
_URxC_ISR:
12
   RxByte = UDR                            ' Datenregister lesen
13

14
   if RxByte=StartFrame then
15
      toggle portb.0                       ' LED umschalten (kontrolle)
16
      else
17
      ' dieser Code wird immer angesprungen
18
   end if
19
Return

Das Programm wird richtig ausgeführt nur nicht die Interrupt-Routine.

Hier wird die Konstante Byte1 mit der Byte-Variablen RxByte verglichen 
und ich bekomme immer False als Ergebnis.

Also die LED toggelt nicht, auch wenn ich den richtigen Wert sende.

Woran liegt das? Was mache ich falsch?
#558182
Lesenswert?

Micha R. wrote:
> Aha,
>
> jetzt klappt es.
> Es lag wohl an dem internen Osc. mit 1Mhz, der zu ungenau ist.
> Habe jetzt einen ext. Quarz mit 3,686400 Mhz genommen, jetzt funzt es.
>
> Vielen Dank.

Tip:

Mit einem Blick in das (inzwischen online lesbare) AVR-Buch von Roland 
Walter wäre das nicht passiert. Da wird extra darauf hingewiesen, dass 
der interne RC-Oszillator dazu zu ungenau ist.

...
#558206
Lesenswert?

TechInfo wrote:
> Hm bei mir klappt die UART-Kommunikation beim STK500 mit internem
> Controller-Quarz.

Der interne Takt kommt nicht von einem Quarz! Er kommt von einem 
RC-Oszillator und ist daher ungenau und nicht temperaturstabil. Wenn es 
bei Dir funktioniert, dann ist das reine Glücksache, das kann nächste 
Woche schon anders aussehen.

> Kommt das auf die Baudrate an, ob sich da Fehler
> einschleichen?

Nein.

...
Gast #558220
Lesenswert?

Also beim Mega186 zB. ist der interne 8Mhz schon DEUTLICH stabiler, als 
beim Mega8!!

Die UART initialisiere ich so:
1
  UCSR0A |= (1<<U2X0);    /* improves baud rate error @ F_CPU = 1 MHz */
2
  UCSR0B |= (1<<TXEN0); /* tx enable */
3
  UCSR0C |=(1<<UCSZ01)|(1<<UCSZ00); //8Bit
4
//  UBRR0H = (unsigned char)(F_CPU / (8 * 9600UL)) - 1 >> 8;
5
//  UBRR0H = (unsigned char)((F_CPU / (8 * 1200UL)) - 1) >> 8;
6
//  UBRR0L = (unsigned char)(F_CPU / (8 * 9600UL)) - 1;  /* 9600 Bd */
7
//  UBRR0L = (unsigned char)(F_CPU / (8 * 1200UL)) - 1;  /* 9600 Bd */
8
 UBRR0 = (F_CPU / ((8L * 1200UL)) - 1);
9

10
 // UBRR0H = 0;
11
  //UBRR0L = 103; //9600 Bd @ 8Mhz
12
  //UBRR0L = 101; //9600 @ 7860khz (2.5V)

klappt wunderbar.

In einer Schleife erhöhe ich OSCCAL gebe ich Wert zum Test aus. Wenn man 
den Wert lesen kann, hat man den korrekten Wert für's OSCCAL Register.
Da ich nicht mit 3V, sondern mit 2.5V arbeite, stimmte der Werkseintrag 
von 162 natürlich nicht mehr 100%tig. ich habe diesen auf 123 
korrigieren müssen.

bei einem UBBR von 6 und einer Taktfrequenz von 62kHz(!) erzeuge ich 
somit stabile 1200Bd.
Das geht in der Klimakammer bei allen erdenklichen Temperaturen.

Das gleiche geht mitm Mega8 zB. NCIHT!

GRuß
AxelR.

An PORTB.0 lässt sich die Oszillatorfrequenz bequem messen...
#558250
Lesenswert?

Uhu Uhuhu wrote:
> Frage: sind die Kalibrierungsdaten eigentlich auf allen Controllern
> desselben Typs gleich, oder werden die im Werk vermessen und
> entsprechend geflasht?

Sie werden ausgemessen.
Bei älteren AVRs, die man selbst calibrieren muss (z.B. Tiny12/15), 
werden sie auch noch in Flash und EEP geschrieben.

Axel, danke für die Aufklärung...

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren