mikrocontroller.net

Forum: Compiler & IDEs UART-Übertragung erzeugt "Abweichung" um 0x40


Autor: Tobias Hipp (taranis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich versuche gerade eine UART-Übertragung zu meinem PC (Win 7, 64 bit, 
HTerm 0.8.1beta und uCon 7.1 als Terminals, WinAVR vom 13.03.2009, 
Code::Blocks als IDE, AVRDude zum flashen).
Der ATMega 8515L sitzt auf einem STK 500.
Den Init-Code habe ich zum großteil aus dem Datenblat von Atmel 
übernommen bzw. Angepasst. Insgesamt sollte ein Frame 8 Datenbits, 2 
Stopbits und keine Parität haben. Die Baudrate von 9600 sollte auch 
stimmen.

Das Problem ist, dass ich statt der erwarteten Zahlen von 0 bis 9 die 
Buchstaben 'p' bis 'y' empfange. Sprich, der ASCII-Code weißt 
irgendwoher eine Art "Offset" von 0x40 auf. Weiß einer von Euch woran 
das liegen kann oder was ich falsch gemacht hab?

Hier 'mein' Quelltext:
#include <avr/io.h>
#include <util/delay.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif

#define BAUD 9600UL      // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif

void uart_init(void)
{
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
    UCSRB |= (1 << TXEN);
    UCSRC |= (1<<URSEL) |(1<<USBS) | (1<< UCSZ0) |(1<<UCSZ1) | (0 << UCSZ2);
    UCSRC |= (0 << UMSEL);
    UCSRC |= (0<< UPM1) | (0 << UPM0);
}

void allg_init(void)
{
    DDRB = 0xFF;
    PORTB = 0xFF;
}

int uart_putc(unsigned char c)
{
    while(! (UCSRA & (1 <<UDRE))){
        ;
    }
    uint8_t i = (uint8_t) c;
    UDR = c;
    PORTB = ~i;
    return 0;
}

int main(void)
{
    uart_init();
    allg_init();
    unsigned char c;
    uint8_t i;
    for(i = 0; i < 10; i++){
        c =(unsigned char) (i + 0x30);
        PORTB = ~i;
        uart_putc(c);
        _delay_ms(900);
        _delay_ms(900);
        _delay_ms(900);
        PORTB = ~(i +0x30);
        _delay_ms(900);
        _delay_ms(900);
        _delay_ms(900);
    }
    c = (unsigned char) (0 + 0x30);
    PORTB = ~(0+0x30);
    uart_putc(c);
    while(1)
    {
        ;
    }
    return 0;
}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tobias Hipp (taranis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber auch nach mehrmaligem Lesen und durchsehen der Checkliste 
weiß ich gerade nicht, wie mir das weiterhilft oder auf was du hinaus 
willst.
Die Verbindung steht ja definitiv, der Quarz (dürfte der Externe sein) 
läuft auf ca. 4MHz (zumindest blinkt die LED dann mit _delay_ms(1000) im 
Sekundentakt).
Kannst du bitte etwas konkreter werden?

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK Manual:

"When the XTAL1 jumper is mounted, the STK500 internal clock system is 
used as main clock to the target AVR. The internal clock system can 
either use a crystal in the on-board crystal socket or a 
software-generated clock from the master microcontroller.
The frequency of the software-generated clock can be set from 0 to 3.68 
MHz. The default value is 3.68 MHz. Section 5.3.5.3 on page 5-7 explains 
how to set the clock frequency from AVR Studio."

Bist du sicher, dass du mit der richtigen CPU-Frequenz arbeitest?
Hast du die Fuses auf externen Quarz umgestellt?

Autor: Tobias Hipp (taranis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe jetzt den Jumper XTAL1 gesteckt gelassen, OSCSEL so 
gesteckt dass der "Onboard XTAL Oscillator" ausgewählt ist (Kontakt 2 
und 3 gebrückt). In den Crystalsocket hab ich einen 12 MHz Quarz 
gesteckt und den Wert im Programm entsprechend angepasst.
Im AVR-Studio hab ich bei den Fuses im SUT_CKSEL Ext.Crystal/Resonater 
High Freq.: Start-up time: 16 CK + 64ms eingestellt.
Jetzt bekomm ich nur noch Schrott im HTerm, bzw. die Lücke zu den 
erwarteten Werten hat sich vergrößert.

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

Bewertung
0 lesenswert
nicht lesenswert
Tobias Hipp schrieb:
> Also ich habe jetzt den Jumper XTAL1 gesteckt gelassen, OSCSEL so
> gesteckt dass der "Onboard XTAL Oscillator" ausgewählt ist (Kontakt 2
> und 3 gebrückt). In den Crystalsocket hab ich einen 12 MHz Quarz
> gesteckt und den Wert im Programm entsprechend angepasst.
> Im AVR-Studio hab ich bei den Fuses im SUT_CKSEL Ext.Crystal/Resonater
> High Freq.: Start-up time: 16 CK + 64ms eingestellt.
> Jetzt bekomm ich nur noch Schrott im HTerm, bzw. die Lücke zu den
> erwarteten Werten hat sich vergrößert.

Gegentest:
Den OSCSEL abziehen. Der µC muss schlagartig stehen.
Tut er das nicht (arbeitet er also weiter), dann arbeitet er auch nicht 
mit dem Onboard XTAL Oscillator.

Autor: Tobias Hipp (taranis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt im HTerm mit der Baudrate rumgespielt. und die scheint nicht 
9600 zu betragen sondern 28800.
Kommt das durch eine Falsche F_CPU Definition?

Autor: Tobias Hipp (taranis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gnarf
Danke für eure Hilfe. Das war eine richtige, ekelige, doofe 
PEBKAC-Situation.
Hatte in den Projektoptionen von Code::Blocks angegeben, dass F_CPU = 
4000000UL sei. Und das vergessen. Also hat die Clock nicht gepasst und 
meine Definition im Sourcecode war für'n Hintern...

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.