www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Constante in If-Anweisung geht nicht?


Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe folgendes Problem:

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

und lege die Interrupt-Routine Fest:
on URxC _URxC_ISR
Enable URxC
Enable Interrupts

Do
 NOP
Loop

' Interrupt-Routine

_URxC_ISR:
   RxByte = UDR                            ' Datenregister lesen

   if RxByte=StartFrame then
      toggle portb.0                       ' LED umschalten (kontrolle)
      else
      ' dieser Code wird immer angesprungen
   end if
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?

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kenn zwar die Programmiersprache nicht (sieht mir nach Basic oder Pascal 
aus) aber bei C muss man bei Vergleichen immer == machen

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
müssen bei if nicht 2 x "=" sein ?

Otto

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so,

habe vergessen zu erwähnen: IDE ist Bascom-AVR Version 1.11.8.7

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und woher weißt Du, daß RxByte irgendwann mal den Wert 10101100b 
enthält?

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uhu Uhuhu
Gute Frage, wahrscheinlich hat er den Fehler gemacht den viele machen 
(auch ich) dass sie den internen RC Osc. + UART verwenden und somit die 
Baudrate nicht stimmt.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein = reicht komischerweise. müssen nichtmal Klammern drum :-)

Er wird die UART Kommunikation wohl vorab getestet haben, oder?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axel Rühl wrote:
> ein = reicht komischerweise. müssen nichtmal Klammern drum :-)
>
> Er wird die UART Kommunikation wohl vorab getestet haben, oder?

Ist halt Basic...

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na, lassen wir das ;-)

Ich habe auch schon mit FastAVR einen MEGA16 voll bekommen...

@Micha

ersetze doch mal die Konstante und schreibe in der interruptroutine:

   if RxByte=65 then
      toggle portb.0   


Dann schickst Du mal ein großes A zum Test.

AxelR.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder noch einfacher: das Byte einfach mal zurückschicken und schauen, 
was so ankommt.

Autor: Micha R. (michaavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: TechInfo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm bei mir klappt die UART-Kommunikation beim STK500 mit internem 
Controller-Quarz. Kommt das auf die Baudrate an, ob sich da Fehler 
einschleichen?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der springende Punkt ist: Es kann funktionieren, muss aber
nicht.
Wenn es bei dir klappt: Super.
Beim nächsten Prozessor; im nächsten Sommer, im nächsten Winter
(Temperaturunterschiede) kann das alles ganz anders aussehen.

Autor: Axel R. (axelr) Flattr this
Datum:

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

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

 // UBRR0H = 0;
  //UBRR0L = 103; //9600 Bd @ 8Mhz
  //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...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axel, nutzt Du das etwa für PR?

...

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frage: sind die Kalibrierungsdaten eigentlich auf allen Controllern 
desselben Typs gleich, oder werden die im Werk vermessen und 
entsprechend geflasht?

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hannes

für einen APRS-Tracker Eigenbau mit gaanz wenig Stromverbrauch.
Aber die 1200Bd (die beiden Töne für Mark und Space) werden gleich im 
AVR per DDS erzeugt.
Dafür brauche ich die UART nicht. mit den 1200Bd war nur Zufall, aber 
stimmt fast ;-))

xlr.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.