www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART lässt mich verrückt werden - ATm48


Autor: Manf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Code:
/*
  avr-gcc -mmcu=atmega48 -Os main.c -o main.elf |   avr-objcopy -O ihex main.elf main.hex |   avrdude -P usb -p atmega48 -c avrisp2 -U flash:w:main.hex
 */


#define F_CPU 3686411UL
#define BAUD 1200L
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) 

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

void main() {
    UBRR0H = UBRR_VAL >> 8;
    UBRR0L = UBRR_VAL & 0xFF;
    
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);

  _delay_ms(50);
  
  while(1) {
    while(!(UCSR0A & (1<<UDRE0)));
    UDR0 = 'n';
    _delay_ms(1000);
  }
}

Die Fuses sind vom dem Engbedded AVR Fuse-Calculator berechnet, 
Taktquelle ist "Ext. Full-swing Crystal; Start-up time PWRDWN/RESET: 16K 
CK/14 CK + 65 ms; [CKSEL=0111 SUT=11]".
"Divide clock by 8 internally" ist deaktiviert.

Mit avrdude also gesetzt:
lfuse:w:0xf7:m
hfuse:w:0xdf:m
efuse:w:0x01:m

Quarz ist ein 3,686411MHz schneller normaler Quarz mit zwei Beinchen ..

Nun zeigt mir Minicom aber im Abstand von der Sekunde, die ja auch 
jeweils gewartet werden soll, dass "\0x00" empfangen wurde.

Entweder übersehe ich grade irgendwas Triviales oder mein AVR hat heute 
was gegen mich ... kann mir jemand sagen, was ich falsch mache?

Manf.

Autor: Manf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der verwendete Mikrocontroller ist übrigens ein ATmega48.

Vielen Dank schonmal für Hilfe,
Manf.

Autor: Manf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der verwendete Mikrocontroller ist übrigens ein ATmega48.

Vielen Dank schonmal für eure Hilfe,
Manf.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: FlipFlop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bin zwar nicht sicher aber ich würde mal den TX-Pin als Ausgang 
setzen.

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while(1) {
    while(!(UCSR0A & (1<<UDRE0)));
    UDR0 = 'n';
    _delay_ms(1000);
  }
ich glaub das ist ein Missverständnis. Versuch mal:
while(1) {
    while(!(UCSR0A & (1<<UDRE0)));
     ;
    UDR0 = 'n';
    _delay_ms(1000);
  }

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ob ein oder zwei Strichpunkte hinter ner while-Schleife stehen, ist 
egal.

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, tatsache hab's beim überfliegen übersehen

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im makefile hast du das?:

MCU     = atmega48p

Hast du winavr 2009-03-13

Schau die die .LST-Datei an! Suche darin nach "UBRR0L = UBRR_VAL & 
0xFF;"
Die wird erzeugt durch:
%.lst: %.elf
  avr-objdump -h -S $< > $@

    UBRR0H = UBRR_VAL >> 8;
    1092:  80 e0         ldi  r24, 0x00  ; 0
    1094:  80 93 c5 00   sts  0x00C5, r24
    UBRR0L = UBRR_VAL & 0xFF;
    10d2:  8f eb         ldi  r24, 0xBF  ; 191
    10d4:  80 93 c4 00   sts  0x00C4, r24


Ansonsten kanns an der Hardware liegen. Abblockkondensatoren, 
Anschaltung des MAX232, Masseverbindung zwischen PC und ATMega, usw.
Miss mal sie Spannungen -10V / +10V am MAX232 (sind normalerweise -8V / 
+9V oder so.

Setze die Baudrate für /dev/TTYS0 mal damit:

port=/dev/ttyS0
setserial $port divisor 96
setserial $port spd_cust
stty speed 1200 < $port

oder nur damit:
stty speed 1200 < /dev/TTYS0


Probier mal 'gtkterm' anstatt 'minicom'

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.