Forum: Mikrocontroller und Digitale Elektronik UART ATtiny2313


von Doran S. (utzer)


Lesenswert?

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
24
#endif
25
26
#define BAUD 9600UL          // Baudrate
27
 
28
// Berechnungen
29
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
30
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
31
#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
void uart_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........

von spess53 (Gast)


Lesenswert?

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

von Doran S. (utzer)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Was für einen Oszillator (für den CPU-Takt) benutzt du?

MfG Spess

von avr (Gast)


Lesenswert?

Register anderst beschreiben:

  UBRRL = UBRR_VAL >> 8;
  UBRRH = 0x00;

dann sollte es laufen.

von holger (Gast)


Lesenswert?

>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?

von Doran S. (utzer)


Lesenswert?

ok, habe ich ausprobiert, aber es läuft nicht.......
jetzt kommen nur noch (manchmal) y's!!!
1
void uart_putc(unsigned char c)
2
{
3
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
4
    {
5
    }                             
6
 
7
    UDR = c;                      /* sende Zeichen */
8
}
9
10
//######################################################################################################
11
12
13
void uart_puts( char * s )
14
{
15
    uart_init();
16
     
17
    while(*s)
18
    {   /* 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

von spess53 (Gast)


Lesenswert?

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

von Doran S. (utzer)


Lesenswert?

Hallo,

danke für die Mühe, aber UBRR ohne H und L geht nicht, da kommen 
Errors....

utzer

von Doran S. (utzer)


Lesenswert?

Hallo,

hab noch vergessen, der Quarz ist ein ganz normaler so mit 2 
Anschlüssen, also kein Quarzoszillator.....

utzer

von Magnus Müller (Gast)


Lesenswert?

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 ;)

von Magnus Müller (Gast)


Lesenswert?

Was steht denn im Fuse Low Byte drin? Ist evtl. die CKDIV8-Fuse noch 
programmiert?

von avr (Gast)


Lesenswert?

Stimmt:

Falsch:  UBRRL = UBRR_VAL >> 8;

Richtig: UBRRL = UBRR_VAL;

Danke spess53, sch.. CopyPast

von Hubert G. (hubertg)


Lesenswert?

In den Fuses ist der Quarz auch aktiviert, sonst läuft intern der 1MHz 
Takt.

von Doran S. (utzer)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?


von Magnus Müller (Gast)


Lesenswert?

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!)

von Doran S. (utzer)


Lesenswert?

Hallo,

ich habe die Fuses im AVR-Studio programmiert, da steht jetzt:

ext. Crystall osc. 3.0-8.0 MHZ startup-time 14CK+4.1MS

utzer

von Doran S. (utzer)


Lesenswert?

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

von Doran S. (utzer)


Lesenswert?

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:
1
void uart_init()
2
{
3
  UCSRB |= (1<<RXEN);
4
  UCSRB |= (1<<TXEN);
5
  //UCSRC |= (1<<UCSZ0);
6
  //UCSRC |= (1<<UCSZ1);
7
8
  UBRRH = UBRR_VAL >> 8;
9
  UBRRL = UBRR_VAL;
10
}

Bin happy, das es jetzt funktioniert!

utzer

von vorhernachher (Gast)


Lesenswert?

Moin

laut Datenblatt ;)

Note: 1. The example code assumes that the part specific header file is 
included.
1
void USART_Init( unsigned int baud )
2
{
3
/* Set baud rate */
4
UBRRH = (unsigned char)(baud>>8);
5
UBRRL = (unsigned char)baud;
6
/* Enable receiver and transmitter */
7
UCSRB = (1<<RXEN)|(1<<TXEN);
8
/* Set frame format: 8data, 2stop bit */
9
UCSRC = (1<<USBS)|(3<<UCSZ0);
10
}

von Doran S. (utzer)


Lesenswert?

Hallo,

leider war ich wohl doch etwas voreilig.....

folgender Code funktioniert ohne Probleme.....
1
uart_puts("Aktueller Wert: ");
2
  _delay_ms(5);
3
4
  //ioe ist eine int variable im EEPROM
5
  itoa(ioe, senden, 10);
6
  uart_puts(senden);
7
  _delay_ms(5);
8
  uart_putc('\n');
9
  _delay_ms(5);
.....wenn ich allerdings direkt dahinter das hier schreibe.....
1
if((PINB & 2)==0) //Wenn Taster an PB1 gedrückt
2
  {
3
    uart_puts("Geben Sie den neuen Wert ein: ");
4
    _delay_ms(5);
5
    uart_gets(empfang, 3);
6
    _delay_ms(5);
7
8
                //ioe ist eine int variable im EEPROM
9
10
    ioe=atoi(em);
11
12
                //zum testen.....
13
14
    itoa(ioe, em, 10);
15
16
    uart_puts("\nGespeichert ist nun: ");
17
    _delay_ms(5);
18
    uart_puts(em);
19
  }
.....dann funktioniert garnichts mehr, es kommen nur noch komische 
Zeichen.....

weiß jemand woran das liegt?

utzer

von Doran S. (utzer)


Lesenswert?

Hallo,

ich habe nun ein anderes Programm geschrieben:
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
#include<avr/interrupt.h>
9
#include "UARTB.h"
10
#include<stdlib.h>
11
#include <avr/eeprom.h>
12
13
int main()
14
{
15
  char a[100];
16
17
  uart_init();
18
  uart_puts("Hallo, dies ist ein Test\n");
19
  _delay_ms(1);
20
  uart_puts("Geben Sie die '1' ein, um ein anderes Menü aufzurufen\n");
21
  _delay_ms(1);
22
  uart_gets(a, 20);
23
  _delay_ms(1);
24
  uart_puts("\nIhre Eingabe war: ");
25
  _delay_ms(1);
26
  uart_puts(a);
27
28
  return 0;
29
}
da funktioniert alles........
jetzt bin ich ratlos.....

utzer

von Doran S. (utzer)


Lesenswert?

ok, danke für alles nochmals, hab das Problem jetzt gefunden.....
war wohl zuviel für den tiny2313......
utzer

von JT (Gast)


Lesenswert?

Frage: Wo hast du
1
#include "UARTB.h"
her?
Mein Problem:
Microcontoller: Attiny2313; 8Mhz
Win-AVR-Complier sagt zu der Funktion
1
uart_puts("ABECDEFGHIJKLMNOPQRSTUVWXYZ\n");
../Neu.c:43: warning: implicit declaration of function 'uart_gets'
und zu "uart_gets" sagt er das gleiche... :C

Vielen Dank für die Antworten, JT

von Doran (Gast)


Lesenswert?

hatte mir die Header-Datei selbst gebastelt...

von Jonas T. (jonas_t)


Lesenswert?

Wie? kannst du die mir mal deine Version posten? Oder mir sagen wo du 
sie gefunden hast? Das wäre nett...
Gruß von der Schwäbischen Alb, Jonas

von Doran (Gast)


Lesenswert?

Ich habe die Funktionen aus dem Tutorial hier von der Seite und im 
Datenblatt steht auch einiges...

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.