mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART ATtiny2313


Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include<avr/io.h>
#include<inttypes.h>
#ifndef F_CPU
#define F_CPU 4000000UL
#endif
#include<util/delay.h>
#include<stdint.h>


#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif 
 
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
   verwendet wird und dort eine andere, nicht zur Hardware passende 
   Taktrate eingestellt ist: Dann wird die folgende Definition 
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 4000000UL    // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
#endif

#define BAUD 9600UL          // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)      // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif

void uart_init()
{
  UCSRB |= (1<<RXEN);
  UCSRB |= (1<<TXEN);                // UART TX einschalten
  UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 

  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
}

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Register anderst beschreiben:

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

dann sollte es laufen.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, habe ich ausprobiert, aber es läuft nicht.......
jetzt kommen nur noch (manchmal) y's!!!
void uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }                             
 
    UDR = c;                      /* sende Zeichen */
}

//######################################################################################################


void uart_puts( char * s )
{
    uart_init();
     
    while(*s)
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
        uart_putc(*s);
        s++;
    }
}
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

utzer

Autor: Doran S. (utzer)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hallo,

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

utzer

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Magnus Müller (Gast)
Datum:

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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt:

Falsch:  UBRRL = UBRR_VAL >> 8;

Richtig: UBRRL = UBRR_VAL;

Danke spess53, sch.. CopyPast

Autor: Hubert G. (hubertg)
Datum:

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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!)

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht 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:
void uart_init()
{
  UCSRB |= (1<<RXEN);
  UCSRB |= (1<<TXEN);
  //UCSRC |= (1<<UCSZ0);
  //UCSRC |= (1<<UCSZ1);

  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL;
}

Bin happy, das es jetzt funktioniert!

utzer

Autor: vorhernachher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin

laut Datenblatt ;)

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

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

folgender Code funktioniert ohne Probleme.....
uart_puts("Aktueller Wert: ");
  _delay_ms(5);

  //ioe ist eine int variable im EEPROM
  itoa(ioe, senden, 10);
  uart_puts(senden);
  _delay_ms(5);
  uart_putc('\n');
  _delay_ms(5);
.....wenn ich allerdings direkt dahinter das hier schreibe.....
if((PINB & 2)==0) //Wenn Taster an PB1 gedrückt
  {
    uart_puts("Geben Sie den neuen Wert ein: ");
    _delay_ms(5);
    uart_gets(empfang, 3);
    _delay_ms(5);

                //ioe ist eine int variable im EEPROM

    ioe=atoi(em);

                //zum testen.....

    itoa(ioe, em, 10);

    uart_puts("\nGespeichert ist nun: ");
    _delay_ms(5);
    uart_puts(em);
  }
.....dann funktioniert garnichts mehr, es kommen nur noch komische 
Zeichen.....

weiß jemand woran das liegt?

utzer

Autor: Doran S. (utzer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe nun ein anderes Programm geschrieben:
#include<avr/io.h>
#include<inttypes.h>
#ifndef F_CPU
#define F_CPU 4000000UL
#endif
#include<util/delay.h>
#include<stdint.h>
#include<avr/interrupt.h>
#include "UARTB.h"
#include<stdlib.h>
#include <avr/eeprom.h>

int main()
{
  char a[100];

  uart_init();
  uart_puts("Hallo, dies ist ein Test\n");
  _delay_ms(1);
  uart_puts("Geben Sie die '1' ein, um ein anderes Menü aufzurufen\n");
  _delay_ms(1);
  uart_gets(a, 20);
  _delay_ms(1);
  uart_puts("\nIhre Eingabe war: ");
  _delay_ms(1);
  uart_puts(a);

  return 0;
}
da funktioniert alles........
jetzt bin ich ratlos.....

utzer

Autor: Doran S. (utzer)
Datum:

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

Autor: JT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frage: Wo hast du
#include "UARTB.h"
her?
Mein Problem:
Microcontoller: Attiny2313; 8Mhz
Win-AVR-Complier sagt zu der Funktion
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

Autor: Doran (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hatte mir die Header-Datei selbst gebastelt...

Autor: Jonas Tittmann (jonas_t)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Doran (Gast)
Datum:

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

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.