mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2 mal Uart beim Mega8


Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute!

Folgendes: Ich bräuchte für meinen Mega8 eine 2. Serielle Schnittstelle, 
bzw. Lösungsideen.
Ich will Daten von einem Gerät auslesen (Gerät sendet diese Daten im 
Sekunden Takt) diese seriellen Daten umwandeln und dann an ein anderes 
Gerät (Notebook) senden.

Ist es möglich, nur den Rx-Pin an die eine und nur den Tx-Pin an die 
andere Schnittstelle zu geben?
Das "Sende-Gerät" benötigt keine Rückmeldung (soweit ich bis jetzt 
herausfinden konnte).

lg Fox

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sender und Empfänger sind beim USART weitgehend voneinander unabhängig 
(abgesehen von einigen Einstellungen die für beide Teile gleichzeitig 
gelten, also Baudrate und Frame-Format). Du kannst sie aber auch 
getrennt einsetzen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Sender und Empfänger sind beim USART voneinander unabhängig. Du kannst
> die auch getrennt einsetzen.

... solange die Baudrate gleich ist.


Peter

Autor: Marko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klar kannst Du RX und TX auf verschiedene Geräte
verteilen.
Dann gibts noch die Möglichkeit die RX und TX
beispielsweise per Transistor hin und her zu schalten
oder wenns nicht viele Bauteile sein sollen
kannste auch ne zweite UART als Software-UART
einprogrammieren. Viele Wege führen ans Ziel.

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>... solange die Baudrate gleich ist.

sie kann natürlich auch verschieden sein, vorausgesetzt du willst nicht 
gleichzeitig senden un empfangen

Autor: Ein Name (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die grosse Nährende Mutter Atmel hat auch daran gedacht.

http://www.atmel.com/dyn/general/advanced_search_r...

AVR274: Single-wire Software UART
AVR304: Half Duplex Interrupt Driven Software UART
AVR305: Half Duplex Compact Software UART


Ansonsten Google "AVR software UART"

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey!

Sorry, aber ich steh grad voll auf der Seife... Wie kann ich am besten 
eine Wechselschaltung realisieren, bei der die TX-Leitung zwischen den 
Anschlüssen T1IN und T2IN des MAX232 geschaltet wird...


lg Fox

Autor: Hans (noch einer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu soll das gut sein?

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit ich mit einer UART Schnittstelle zwei RS232 Schnittstellen 
realisieren kann...

lg

Autor: mehrfacher STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie kann ich am besten eine Wechselschaltung realisieren, bei der die >TX-Leitung 
zwischen den Anschlüssen T1IN und T2IN des MAX232 geschaltet >wird...

Wenn das die Sende-TTL-Seite des MAX ist, dann kann man da ein paar 
Gatter davor hängen.
Dazu muß man sich nur im Klaren darüber sein, wann welches Bit wohin 
soll.

Autor: Hans (noch einer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch scheiße. Such dir aus 
http://www.atmel.com/dyn/products/param_table.asp?... statt 
des Mega8 einen AVR mit zwei UARTs raus, oder nimm einen Software UART.

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem ist, dass ich die Schaltung so schnell wie möglich brauche und 
noch einen Haufen ATmega8 herumliegen habe...

Daher muss ich hier eine Lösung finden, um es mit dem mega8 
hinzubekommen...

lg

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Peter,

Hab ich mir schon angesehen...
Ich muss das ganze jetzt noch auf meinen Compiler "umwälzen" (CVAVR).

lg

Autor: Fox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Leider muss ich zugeben, dass ich's nicht pack.
/************************************************************************/
/*                                                                      */
/*                      Software UART using T1                          */
/*                                                                      */
/*              Author: P. Dannegger                                    */
/*                      danni@specs.de                                  */
/*                                                                      */
/************************************************************************/
#include <main.h>
#include <suart.h>


#define BIT_TIME  (u16)((XTAL + BAUD/2) / BAUD)


volatile u8 stx_count;
u8 stx_data;

volatile u8 srx_done;
u8 srx_data;
u8 srx_mask;
u8 srx_tmp;


void suart_init( void )
{
  OCR1A = TCNT1 + 1;      // force first compare
  TCCR1A = 1<<COM1A1^1<<COM1A0;    // set OC1A high, T1 mode 0
  TCCR1B = 1<<ICNC1^1<<CS10;    // noise canceler, 1>0 transition,
          // CLK/1, T1 mode 0
  TIFR = 1<<ICF1;      // clear pending interrupt
  TIMSK = 1<<TICIE1^1<<OCIE1A;    // enable tx and wait for start

  stx_count = 0;      // nothing to sent
  srx_done = 0;        // nothing received
  STXDDR |= 1<<STX;      // TX output
}


u8 sgetchar( void )      // get byte
{
  while( !srx_done );      // wait until byte received
  srx_done = 0;
  return srx_data;
}


SIGNAL( SIG_INPUT_CAPTURE1 )    // rx start
{
  OCR1B = ICR1 + (u16)(BIT_TIME * 1.5);  // scan 1.5 bits after start
  srx_tmp = 0;        // clear bit storage
  srx_mask = 1;        // bit mask
  TIFR = 1<<OCF1B;      // clear pending interrupt
  if( !(SRXPIN & 1<<SRX))    // still low
    TIMSK = 1<<OCIE1A^1<<OCIE1B;  // wait for first bit
}


SIGNAL( SIG_OUTPUT_COMPARE1B )
{
  u8 in = SRXPIN;      // scan rx line

  if( srx_mask ){
    if( in & 1<<SRX )
      srx_tmp |= srx_mask;
    srx_mask <<= 1;
    OCR1B += BIT_TIME;      // next bit slice
  }else{
    srx_done = 1;      // mark rx data valid
    srx_data = srx_tmp;      // store rx data
    TIFR = 1<<ICF1;      // clear pending interrupt
    TIMSK = 1<<TICIE1^1<<OCIE1A;        // enable tx and wait for start
  }
}


void sputchar( u8 val )      // send byte
{
  while( stx_count );      // until last byte finished
  stx_data = ~val;      // invert data for Stop bit generation
  stx_count = 10;      // 10 bits: Start + data + Stop
}


void sputs( u8 *txt )      // send string
{
  while( *txt )
    sputchar( *txt++ );
}


SIGNAL( SIG_OUTPUT_COMPARE1A )    // tx bit
{
  u8 dout;
  u8 count;

  OCR1A += BIT_TIME;      // next bit slice
  count = stx_count;

  if( count ){
    stx_count = --count;    // count down
    dout = 1<<COM1A1;      // set low on next compare
    if( count != 9 ){      // no start bit
      if( !(stx_data & 1) )    // test inverted data
  dout = 1<<COM1A1^1<<COM1A0;  // set high on next compare
      stx_data >>= 1;      // shift zero in from left
    }
    TCCR1A = dout;
  }
}

Im Anhang findet ihr die Fehlerliste...
Ich weiß leider nicht, wie ich die Fehler ausbessern soll.

Mein Compiler ist der Codevision AVR.

lg

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt die Symboldatei einbinden, wo die ganzen Register und Ports 
definiert sind.

Unter AVR-GCC ist das die io.h, Du müßtest daher ne Fehlermeldung 
erhalten haben, daß die io.h nicht gefunden wird.


Peter

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die mega8.h und auch die io.h eingebunden und es klappt 
trotzdem nicht...

in der mega8.h steht u.a. das hier:
sfrb TWBR=0;
sfrb TWSR=1;
sfrb TWAR=2;
sfrb TWDR=3;
sfrb ADCL=4;
sfrb ADCH=5;
sfrw ADCW=4;      // 16 bit access
sfrb ADCSRA=6;
sfrb ADMUX=7;
sfrb ACSR=8;
sfrb UBRRL=9;
sfrb UCSRB=0xa;
sfrb UCSRA=0xb;
sfrb UDR=0xc;
sfrb SPCR=0xd;
sfrb SPSR=0xe;
sfrb SPDR=0xf;
sfrb PIND=0x10;
sfrb DDRD=0x11;
sfrb PORTD=0x12;
sfrb PINC=0x13;
sfrb DDRC=0x14;
sfrb PORTC=0x15;
sfrb PINB=0x16;
sfrb DDRB=0x17;
sfrb PORTB=0x18;
sfrb EECR=0x1c;
sfrb EEDR=0x1d;
sfrb EEARL=0x1e;
sfrb EEARH=0x1f;
sfrw EEAR=0x1e;   // 16 bit access
sfrb UBRRH=0x20;
sfrb UCSRC=0X20;
sfrb WDTCR=0x21;
sfrb ASSR=0x22;
sfrb OCR2=0x23;
sfrb TCNT2=0x24;
sfrb TCCR2=0x25;
sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrw ICR1=0x26;   // 16 bit access
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28;  // 16 bit access
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
sfrw OCR1A=0x2a;  // 16 bit access
sfrb TCNT1L=0x2c;
sfrb TCNT1H=0x2d;
sfrw TCNT1=0x2c;  // 16 bit access
sfrb TCCR1B=0x2e;
sfrb TCCR1A=0x2f;
sfrb SFIOR=0x30;
sfrb OSCCAL=0x31;
sfrb TCNT0=0x32;
sfrb TCCR0=0x33;
sfrb MCUCSR=0x34;
sfrb MCUCR=0x35;
sfrb TWCR=0x36;
sfrb SPMCR=0x37;
sfrb TIFR=0x38;
sfrb TIMSK=0x39;
sfrb GIFR=0x3a;
sfrb GICR=0x3b;
sfrb SPL=0x3d;
sfrb SPH=0x3e;
sfrb SREG=0x3f;

lg

Autor: mehrfacher STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wirf unbedingt einen Blick in die Doku zur Lib-c.
Da steht AFAIR drin, dass man nur die io.h einfügen soll.
Das Makefile sogrt dann dafür, sass die m8.h eingefügt wird.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fox wrote:
> Ich habe die mega8.h und auch die io.h eingebunden und es klappt
> trotzdem nicht...


Hast Du denn schon irgendwas mit dem Codevision zum Laufen gebracht?

Da muß doch auch ein Exampleverzeichnis mit Timerinterrupt sein. Bring 
das mal zum Laufen. Und dann schau Dir an, wie dort IO-Register und 
Interrupts definiert werden.


Deine mega8.h enthält ja keine Bitnamen.


Peter

P.S.:
Benutze den Dateianhang!

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry für die Frage, aber wozu brauch ich Bit Namen?

Ich habe mit CodeVision AVR bereits einige "Projekte" hinter mir und 
habe noch nie Bit Namen gebraucht...

lg

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fox wrote:
> Sorry für die Frage, aber wozu brauch ich Bit Namen?

Wenn Du Dir mal ein Datenblatt anguckst, dann wimmelt es nur so vor 
Bitnamen.

Man kann natürlich statt der Bitnamen auch kryptische Hexwerte 
hinschreiben. Bloß sieht dann kein Schwein mehr durch, was der Code 
macht.

Daher bevorzugen erfahrene Programmierer die Namen aus dem Datenblatt, 
auch wenns mehr Schreibarbeit ist.

Z.B. bei:
TIMSK = 1<<TICIE1^1<<OCIE1A;  
weiß jeder gleich: aha, der Inputcapture und Outputcompare A Interrupt 
von T1 werden enabled.

Es steht Dir frei, das nicht zu tun.
Dann schau ins Datenblatt, was die Bits bedeuten, rechne den 
entsprechenden Hexwert aus und schreib ihn hin.


Peter

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort!

Jetzt ist mir schon einiges klarer...

lg

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.