Hallo,
leider brachte die Suche keine Ergebnisse....
Also: Ich habe einen ATtiny2313 mit einem Externen Quarz 4,000MHZ.
nun habe ich versucht eine UART-Verbindung aufzubauen, doch es
erscheinen nur schwarze Karos...
Hier ein code-Auszug:
1
#include<avr/io.h>
2
#include<inttypes.h>
3
#ifndef F_CPU
4
#define F_CPU 4000000UL
5
#endif
6
#include<util/delay.h>
7
#include<stdint.h>
8
9
10
#ifndef F_CPU
11
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
12
F_CPU im Makefile definiert werden, eine nochmalige Definition
13
hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
14
#ifndef/#endif
15
16
Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
17
verwendet wird und dort eine andere, nicht zur Hardware passende
18
Taktrate eingestellt ist: Dann wird die folgende Definition
19
nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
20
von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
21
noch nicht definiert: */
22
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
23
#define F_CPU 4000000UL // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
32
33
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
34
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
35
#endif
36
37
voiduart_init()
38
{
39
UCSRB|=(1<<RXEN);
40
UCSRB|=(1<<TXEN);// UART TX einschalten
41
UCSRC|=(1<<URSEL)|(3<<UCSZ0);// Asynchron 8N1
42
43
UBRRH=UBRR_VAL>>8;
44
UBRRL=UBRR_VAL&0xFF;
45
}
Mit einem ATmega32 funktionierte das so einwandfrei....
Wo liegt der Fehler?
URSEL? Gibt es das beim ATtiny2313?
wenn nicht, was mache ich dann?
über Antworten würde ich mich sehr freuen!
mfg
utzer
PS: Bin erst 16(Und habe daher wenig Erfahrung) und das ist mein 2.
UART-Projekt........
Hi
>URSEL? Gibt es das beim ATtiny2313?
Nein. Braucht es beim ATTiny nicht. Übrigens findest du die genaue
Beschreibung der Register und der einzelnen Bits im Datenblatt.
MfG Spess
Hallo,
ok, danke, ich habe jetzt einfach URSEL weggelassen...
es kommen aber jetzt immernoch Karos beim Empfangen im Terminal...
weiß jemand, woran das liegt?
utzer
>Wo liegt der Fehler?>URSEL? Gibt es das beim ATtiny2313?
Das sollte dir der Compiler schon mit Errors
um die Ohren hauen.
>wenn nicht, was mache ich dann?
Das Programm für einen ATtiny2313 übersetzen?
{/* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
19
uart_putc(*s);
20
s++;
21
}
22
}
Die Funktion uart_puts() wird aufgerufen, wenn ich etwas senden will...
gibt es sonst noch einen Fehler?
utzer
EDIT: Wie übersetze ich das Programm für den Tiny2313
Hi
>Register anderst beschreiben:>> UBRRL = UBRR_VAL >> 8;> UBRRH = 0x00;>>dann sollte es laufen.
Was meinst du , was von 0x19 noch übrig bleibt, wenn du es 8x nach
rechts shiftest?
Nach meinen spärlichen C-Kenntnissen sollte GCC auch:
UBRR = UBRR_VAL
können.
MfG Spess
Doran S. schrieb:
> Hallo,>> danke für die Mühe, aber UBRR ohne H und L geht nicht, da kommen> Errors....
Muss wohl daran liegen, dass UBRRL und UBRRH 7 Bytes voneinander
entfernt liegen ;)
Hallo,
danke das ihr euch so Mühe gebt, aber ich bekomme es einfach nicht zum
laufen..... beim ATmega32 hatte ich solche Probleme nicht.....
Wieso läuft es dann beim ATtiny2313 nicht, wie muss ich den UART
initialisieren? Ich habe Parität=None, 8 Databits, 1 Stoppbit....
utzer
Doran S. schrieb:
> gibt es sonst noch einen Fehler?>> utzer>> EDIT: Wie übersetze ich das Programm für den Tiny2313
* AUTSCH *
Indem Du das Makefile entsprechend anpasst...? (anschließend das
Compilieren nicht vergessen!)
Hallo,
ich habe keine Makefile, da ich AVR-Studio benutze.....
Als Board nehme ich ein STK500...
Funktioniert der Code denn so nicht für den Tiny2313?
Denn Als Device habe ich im AVR-Studio schon ATtiny2313 eingestellt.
Nur die Funktionen uart_puts(), uart_putc() und uart_init() habe ich
übernommen, da ich ein neues Projekt in AVR-Studio erstellt habe.....
utzer
Hallo,
danke für die Hilfe, nach nochmaligem Durchlesen habe ich es nun
geschafft....
CKDIV8-Fuse war noch programmiert, die Funktion UART_init() sieht nun so
aus: