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


von Manf (Gast)


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.

von Manf (Gast)


Lesenswert?

Der verwendete Mikrocontroller ist übrigens ein ATmega48.

Vielen Dank schonmal für Hilfe,
Manf.

von Manf (Gast)


Lesenswert?

Hallo,

der verwendete Mikrocontroller ist übrigens ein ATmega48.

Vielen Dank schonmal für eure Hilfe,
Manf.

von Falk B. (falk)


Lesenswert?


von FlipFlop (Gast)


Lesenswert?

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

von micha (Gast)


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
  }

von Flo (Gast)


Lesenswert?

ob ein oder zwei Strichpunkte hinter ner while-Schleife stehen, ist 
egal.

von micha (Gast)


Lesenswert?

Oh, tatsache hab's beim überfliegen übersehen

von Hans-jürgen H. (hjherbert) Benutzerseite


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'

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.