UART lässt mich verrückt werden - ATm48

Gast #1606188
Lesenswert?

Hallo,

Code:
1
/*
2
  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
3
 */
4

5

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

10
#include <avr/io.h>
11
#include <util/delay.h>
12
#include <stdlib.h>
13

14
void main() {
15
    UBRR0H = UBRR_VAL >> 8;
16
    UBRR0L = UBRR_VAL & 0xFF;
17
    
18
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
19
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);
20

21
  _delay_ms(50);
22
  
23
  while(1) {
24
    while(!(UCSR0A & (1<<UDRE0)));
25
    UDR0 = 'n';
26
    _delay_ms(1000);
27
  }
28
}

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.
Gast #1606350
Lesenswert?

1
while(1) {
2
    while(!(UCSR0A & (1<<UDRE0)));
3
    UDR0 = 'n';
4
    _delay_ms(1000);
5
  }
ich glaub das ist ein Missverständnis. Versuch mal:
1
while(1) {
2
    while(!(UCSR0A & (1<<UDRE0)));
3
     ;
4
    UDR0 = 'n';
5
    _delay_ms(1000);
6
  }
Persönliche Seite #1606362
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

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