PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uart zwischen Atmega8 und Attiny2313



dj_cyborg
12.10.2012, 12:49
Hallo Robotergemeinde,

zuerst mal ein Lob für das tolle Forum.

Zu meinem Problem, ich möchte via Uart Daten in Form eines Strings von einem Atmega8 zu einen Attiny 2313 senden. Dieser soll die Daten auf einen Display ausgeben.
Beide laufen mit 8MHZ und einer Baudrate von 19200 (Habe auch 9600, 4800, 2400 getestet). Alle beide MC´s benutzen den Hardware Uart.
Mein Problem ist nun das nur wilde Zeichen auf dem Display ankommen.

-Das Display ist i.O.
-und die Daten vom Atmega8 werden auch korrekt gesendet (Anzeige am PC)

Hardware:
-Habe die RXD und TXD - Ausgänge der MC´s gedreht miteinander verbunden. (Hoffe das ist so OK :confused:)

Software:
-der Atmega sendet via Print nur einen einfachen Teststring

Print "HalloDu!"
-beim Attiny habe ich so gut wie alle Möglichkeiten Versucht. INPUT/INPUTBIN/WAITKEY/INKEY... weder als Binärcode als String kommt was Gescheites an...
Wobei bei Input glaube ich gar nichts angekommen ist, was mich vermuten lässt das Daten verloren gegangen sind und kein Vollständiges "Paket" übermittelt wurde.

Hatt jemand evtl. eine Idee wo ich noch dran Drehen kann.

tausend Dank

mfG

BastelWastel
12.10.2012, 13:38
Willkommen im FoRum.

- Hast du RxD auf TxD und TxD auf RxD?
- Haben beide den selben ground?
- Haben beide die selbe Baudrate?

Gruss, Andreas

oberallgeier
12.10.2012, 13:48
Willkommen im Forum

und danke für das Lob. Leider bin ich kein Bascom-er, ich programmiere in C, aber vielleicht kann ich doch helfen.

Der 2313 hat so wenig SRAM, dass bei ihm - jedenfalls bei meinen wenigen Versuchen - die UART-Ausgabe nur äusserst spärlich möglich ist. Es könnte sein, dass Du garnicht genug Platz hast, um Deinen empfangenen String unterzubringen. Gibts in Bascom nach dem Compilieren eine Auskunft darüber, wieviel Bytes Flash und SRAM verbraucht werden? Ich hatte mal ne gute Weile nach nem Fehler gesucht - bis ich merkte, dass der Compiler immer wieder ein störungsfreies Compilat meldete - bei einem SRAM-Verbrauch von irgendwo mehr als 110 %. Da lief dann auch nix (war aber kein UART-Abenteuer).

Lösungsvorschlag: WENN der Compiler nix Verdächtiges meldet, sende doch mal vom m8 den String "äh" - oder so.

dj_cyborg
12.10.2012, 13:49
Hallo Andreas

und Danke für deine schnelle Antwort.

-ja (ich prüf´s aber jetzt nochmal) Hängt aber sonst nicht dazwischen auch kein MAX232. Ist der notwendig?
-ja (Modulbauweise, wird mit übergeben)
-ja 19200 und beide 8MHz Taktung



mfG
Mario

dj_cyborg
12.10.2012, 13:53
Danke auch dir für deineschnelle Antwort Oberallgeier.

Ich hatte auch schon eine Meldung das ich den SRAM überschritten habe. Habe dann erstmal alles eingekürzt. Mein String ist erstmal nur 8 Zeichen lang. das sollte eigentlich noch funktionieren. Aber ich werde mal alles raushauen um zu testen. evtl. hängts ja wirklich daren. Danke erstmal...

Kampi
12.10.2012, 14:07
Hallo Andreas

und Danke für deine schnelle Antwort.

-ja (ich prüf´s aber jetzt nochmal) Hängt aber sonst nicht dazwischen auch kein MAX232. Ist der notwendig?
-ja (Modulbauweise, wird mit übergeben)
-ja 19200 und beide 8MHz Taktung



mfG
Mario

Hey und willkommen,

ein MAX232 ist für eine µC zu µC VErbindung nicht notwendig (eher überflüssig :) )
Kannst du mal die beiden Quellcodes posten?
Eventuell ist da der Wurm drin. Fuses sind auch richtig gesetzt? (Nicht das ein Chip noch ein Clockteilerfuse gesetzt hat oder sowas).
Ansonsten testweise 1 Zeichen senden und gucken ob das klappt und dann hocharbeiten.

BastelWastel
12.10.2012, 14:15
Von uC zu uC hast du ja TTL Pegel, sprich 5V..da braucht es keinen MAX232.

Den MAX232 brauchst du nur zum PC hin..
Der serielle Port am PC hat EIA-232 konforme Pegel.. d.h. -12V fuer logic high und +12V fuer logic low.

dj_cyborg
12.10.2012, 14:17
Hi Daniel,
auch dir Danke für deine Hilfe.

Puh, da bin ich aber Froh das der Max232 überflüssig ist. Habe die Platine gestern fertig gefräst.;)

Quellcode für den Sender Atmega8 (das wichtige steht ganz unten)

'************************************************* ******************************
'************************************************* ******************************
'******************************* CyBot V1.0 ************************************
'************************************************* ******************************
'************************** 01.10.2012 by CYBORG *******************************
'************************************************* ******************************
'************************************************* ******************************

'****************************** Allgemein **************************************
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

'**************************** LCD - Anzeige ************************************
Declare Sub Print_out()
$baud = 19200
Dim Lcdcount As Integer

'**************************** LED - Anzeige ************************************
Declare Sub Led_mode()
Led Alias Portc.1
Config Led = Output
Dim Led_in As Integer
Dim Led_out As Integer
Dim Led_count As Integer
Dim Led_modus As String * 16
Led_modus = "Stop"

'******************************* Sensoren **************************************
Declare Sub Sensor_check()
Smfront Alias Pind.3
Srfront Alias Pind.4
Slfront Alias Pinb.6
Smback Alias Pind.6
Srback Alias Pinc.4
Slback Alias Pind.7

S1 Alias Pind.5
S2 Alias Pinb.7

Config Smfront = Input
Config Srfront = Input
Config Slfront = Input
Config Smback = Input
Config Srback = Input
Config Slback = Input

Config S1 = Input
Config S2 = Input

Portb.7 = 1 'PullUp-Widerstand einschalten
Portb.6 = 1 'PullUp-Widerstand einschalten
Portc.4 = 1 'PullUp-Widerstand einschalten
Portd.3 = 1 'PullUp-Widerstand einschalten
Portd.4 = 1 'PullUp-Widerstand einschalten
Portd.5 = 1 'PullUp-Widerstand einschalten


'***************************** RC5 - Sensor ************************************
Declare Sub Rc5_check()
'Config Rc5 = Pind.2
'$lib "mcsbyte.lbx"
'Enable Interrupts
'Dim Rc5count As Integer
'Dim Address As Byte , Command As Byte

Rc5 Alias Pind.2
Config Rc5 = Input
Portd.2 = 1
Config Timer0 = Timer , Prescale = 1
On Timer0 Timer_irq
Const Timervorgabe = 34
Enable Timer0
Enable Interrupts
Dim Rc5bit As Bit

'*************************** Motor - Antrieb ***********************************
Declare Sub M_move()
Mrfront Alias Portb.0
Mrback Alias Portc.3
Mrspeed Alias Portb.1
Mlfront Alias Portb.5
Mlback Alias Portb.4
Mlspeed Alias Portb.2

Config Mrfront = Output
Config Mrback = Output
Config Mrspeed = Output
Config Mlfront = Output
Config Mlback = Output
Config Mlspeed = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Compare1a = 0
Compare1b = 0

Dim Mfast As Integer
Dim Mmedium As Integer
Dim Mslow As Integer
Dim Mstop As Integer
Dim Mtimer As Integer
Dim Mmodus As String * 16

Mfast = 255
Mmedium = 205
Mslow = 155
Mstop = 0

'*************************** Motor - Lüfter ************************************
Cleaner Alias Portb.3
Config Cleaner = Output
Cleaner = 0
'Config Timer0 = Pwm , Prescale = 1

'**************************** DC - Messung *************************************
Declare Sub Adc_check()
Const Adc_const = 0.0048828125 ' = 5.0 / 1024.0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim Adc_value As Word
Dim Adc_volt As Single
Dim Adc_count As Integer


'*********************** Start - Hauptprogramm *********************************
Do

'LED Anzeigemodus setzen
Led_mode

'Spannung messen
Adc_check

'Sensoren abfragen
Sensor_check

'IR abfragen
Rc5_check

'Motoren steuern
M_move

'Display ausgabe
Print_out


Loop

'************************ Start - LED Anzeige **********************************
Sub Led_mode()

'Modus setzen
Select Case Led_modus

Case "Normal"
Led_in = 6000
Led_out = 6000

Case "Srfront"
Led_in = 500
Led_out = 500

Case "Slfront"
Led_in = 500
Led_out = 500

Case "Srback"
Led_in = 500
Led_out = 500

Case "Slback"
Led_in = 500
Led_out = 500

Case Else
Led_in = 1
Led_out = 0
End Select

'Led anzeige
If Led = 0 Then
If Led_count >= Led_out Then
Led = 1
Led_count = 0
Else
Led_count = Led_count + 1
End If
Elseif Led = 1 Then
If Led_count >= Led_in Then
Led = 0
Led_count = 0
Else
Led_count = Led_count + 1
End If
End If

End Sub

'********************* Start - Spannungsmessung ********************************
Sub Adc_check()

If Adc_count = 500 Then
Adc_value = Getadc(5)
Adc_volt = Adc_value * Adc_const
Adc_count = 0
Else
Adc_count = Adc_count + 1
End If

End Sub

'************************ Start - Sensorcheck **********************************
Sub Sensor_check()

Select Case 1

Case Srfront
Led_modus = "Srfront"
Case Slfront
Led_modus = "Slfront"
Case Srback
Led_modus = "Srback"
Case Slback
Led_modus = "Slback"
Case Else
Led_modus = "Normal"
End Select

End Sub

'********************* Start - Antriebssteuerung *******************************
Sub M_move()

'Auf neue Sensorauslösung reagieren, ggf. Timer abbrechen
If Led_modus <> Mmodus And Led_modus <> "Normal" Then
Mmodus = Led_modus
Mtimer = 0
Else
'Modus bis Timerende durchlaufen
If Mtimer > 0 Then
Mmodus = Mmodus
Else
Mmodus = Led_modus
Mtimer = 0
End If
End If

Select Case Mmodus
Case "Stop"
Mrfront = 0
Mrback = 0
Mlfront = 0
Mlback = 0
Compare1a = Mstop
Compare1b = Mstop
Case "Normal"
Mrfront = 1
Mrback = 0
Mlfront = 1
Mlback = 0
Compare1a = Mmedium
Compare1b = Mmedium
Case "Srfront"
If Mtimer <= 15000 Then
'Zurück fahren
Mrfront = 0
Mrback = 1
Mlfront = 0
Mlback = 1
Compare1a = Mmedium
Compare1b = Mmedium
Elseif Mtimer <= 32000 Then
'rechts drehen
Mrfront = 0
Mrback = 1
Mlfront = 1
Mlback = 0
Compare1a = Mmedium
Compare1b = Mmedium
Else
Mtimer = 0
Mmodus = "Normal"
End If
Case "Slfront"
If Mtimer <= 15000 Then
'Zurück fahren
Mrfront = 0
Mrback = 1
Mlfront = 0
Mlback = 1
Compare1a = Mmedium
Compare1b = Mmedium
Elseif Mtimer <= 32000 Then
'rechts drehen
Mrfront = 1
Mrback = 0
Mlfront = 0
Mlback = 1
Compare1a = Mmedium
Compare1b = Mmedium
Else
Mtimer = 0
Mmodus = "Normal"
End If
Case "Srback"
If Mtimer <= 15000 Then
'Zurück fahren
Mrfront = 1
Mrback = 0
Mlfront = 1
Mlback = 0
Compare1a = Mmedium
Compare1b = Mmedium
Elseif Mtimer <= 32000 Then
'rechts drehen
Mrfront = 1
Mrback = 0
Mlfront = 0
Mlback = 1
Compare1a = Mmedium
Compare1b = Mmedium
Else
Mtimer = 0
Mmodus = "Normal"
End If

Case "Slback"
If Mtimer <= 15000 Then
'Zurück fahren
Mrfront = 1
Mrback = 0
Mlfront = 1
Mlback = 0
Compare1a = Mmedium
Compare1b = Mmedium
Elseif Mtimer <= 32000 Then
'rechts drehen
Mrfront = 0
Mrback = 1
Mlfront = 1
Mlback = 0
Compare1a = Mmedium
Compare1b = Mmedium
Else
Mtimer = 0
Mmodus = "Normal"
End If

End Select


End Sub

'*********************** Start - IR-Aktion ********************************
Sub Rc5_check()

'If Rc5count = 8 Then
' Getrc5(address , Command)
' If Address <> 255 Then
' Print Address ; Command
' End If
' Rc5count = 0
'Else
' Rc5count = Rc5count + 1
'End If

End Sub


Timer_irq:

Timer0 = Timervorgabe

'Motorlaufzeit zählen
If Mmodus <> "Normal" Then
Mtimer = Mtimer + 1
End If

'IR-Schnittstelle abfragen
If Rc5 = 0 Then
Rc5bit = 0
End If
Return

'*********************** Start - DisplayAusgabe ********************************
Sub Print_out()

If Lcdcount = 5000 Then
Print "HalloDu!"

Lcdcount = 0
Else
Lcdcount = Lcdcount + 1
End If

End Sub

End

Und eine Variante für den Attiny2313 (Empfänger)

'************************************************* ******************************
'************************************************* ******************************
'************************** LCD to TXD/RXD V1.0 ********************************
'************************************************* ******************************
'************************** 12.10.2012 by CYBORG *******************************
'************************************************* ******************************
'************************************************* ******************************

'****************************** Allgemein **************************************
$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200

'************************************ Buzzer ***********************************
Buzzer Alias Portd.6
Config Buzzer = Output

'************************************* LCD *************************************
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portb.0 , Db6 = Portd.4 , _
Db7 = Portd.3 , E = Portb.1 , Rs = Portb.2
Config Lcd = 16 * 1a

Initlcd

Cls
Locate 1 , 1
Lcd " SYSTEM "
Locate 2 , 1
Lcd "loading!"

'******************************** Taster ***************************************
Tfor Alias Pind.2
Tmode Alias Pina.0
Tback Alias Pina.1

Config Tfor = Input
Config Tmode = Input
Config Tback = Input

Portd.2 = 1 'PullUp-Widerstand einschalten
Porta.0 = 1 'PullUp-Widerstand einschalten
Porta.1 = 1 'PullUp-Widerstand einschalten


'******************************** TXD/RXD **************************************
Dim My_string As String * 1




'*********************** Start - Hauptprogramm *********************************
Do
If Ischarwaiting() = 1 Then
My_string = Inkey()
Cls
Lcd My_string
End If
Loop


End

-die Leitungen habe ich nochmal geprüft, die sollten passen.
-das Programm für die Attiny habe ich auch mal aufs nötigste gekürzt hat nichts gebracht.
-FuseBits kontrolliere ich jetzt nochmal

mfG
Mario

dj_cyborg
12.10.2012, 14:23
Wastel, danke nochmal für die Erklärung zum MAX232, so lags mir auch im Sinn. Bin gerade eben nochmal etwas unsicher geworden...:confused:

dj_cyborg
12.10.2012, 14:35
Jiiippiiiiiiiiijjjjaaaaaaaaaaajjjjjjjjeeeeeeeeeeee , ihr seit Spitze :)

der Teiler durch 8 war noch in den FuseBits... Hab gestern Nacht gegen 24:00 noch die Platine für den Attiny2313 bestückt und paar Code-Zeilen geschrieben... hätte ich lassen sollen, war wohl doch zu spät.

Auf jedenfall jetzt klappts. tausend Dank Daniel und allen anderen für Eure Hilfe.

TOP-Forum

mfG
Mario

Kampi
12.10.2012, 14:38
Über den bin ich auch schon gestolpert :D
Fieses kleines Bit :P
Aber über solche "Flüchtigkeitsfehler" stolpere ich auch immer wenn ich Abends noch programmiere.
Aber schön das es nun klappt.

BastelWastel
12.10.2012, 14:49
Ja, der Hund is recht 'beliebt' ;)

dj_cyborg
12.10.2012, 14:55
Ich möchte eigentlich mal wissen warum sie den Bit als Default eingestellt haben. :confused:

Kampi
12.10.2012, 15:14
Eine bessere Frage (ähnliches Problem) warum ist beim Mega128 defaultmässig ein Bit gesetzt, welches den Mega128 zu einem Mega103(oder sowas ähnliches) macht.
Sind zwar Pinkompatibel aber nicht von der Hardware und den ISP Pins :)