PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART - Integer empangen unvollständig?



TobiasBlome
19.02.2008, 20:52
Hallo,
ich möchte eine Variable (Integer) mit einem µC senden und mit einem anderen empfangen und wieder in eine Variable (Integer) schreiben:

Der Empänger macht mir etwas probleme:
Das was der Empänger empfängt, sendet er an den PC zum testen weiter. Wenn also zB. 12345 ankommen müsste bekomme ich auf dem PC alles untereinander geschrieben:
1
2
3
4
5

Könnte es daran liegen, dass jedes Zeichen für sich empfangen wird?
Gibt es eine andere Möglichkeit? - oder kann man bis zum CR (Carriage Return) alles in eine Integer Variable schreiben?

Tobias



'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 3686400 'Quarz: 3.6864 MHz

$baud = 9600

Dim A As Integer
Dim I As Integer

Config Pind.0 = Input
Config Pind.3 = Output

Print "ok"

Do



If Usr.rxc = 1 Then 'Wenn Zeichen ankommt
I = Udr 'UART auslesen
Print Chr(i)

'A = Chr(i) 'WIE MUSS DAS RICHTIG HEISSEN?
'Print A

End If


Und noch der sender (nur Print Variable über Timer)


'Variable "A" wird zum testen hochgezählt und über die serielle Schittstelle gesendet
'Funktion getestet ok

'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "ATtiny2313.dat" 'ATtiny2313-Deklaration
$crystal = 18432000 '18,432MHz
$baud = 9600


'-------------------------------------------------------------------------------
'16Bit Timer:
Config Timer1 = Timer , Prescale = 1024
On Timer1 Timer_irq
Const Timervorgabe = 47535 'also 1 mal pro Sekunde!!!
Enable Timer1
Enable Interrupts

'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Config Pinb.0 = Output
Config Pind.6 = Output
Led Alias Portd.6
Led2 Alias Portb.0

'-------------------------------------------------------------------------------
'Variablen
Dim Led_z As Byte
Dim A As Integer

'-------------------------------------------------------------------------------
'Programm

A = 12345
Led = 0

Do

If A => 32767 Then
A = 12345
End If

Loop



'................................................. ..............................
Timer_irq:
Timer1 = Timervorgabe
Incr A
Print A
Toggle Led
Return

TobiasBlome
19.02.2008, 21:13
durch einen Zufall (2 Programme gemischt) hab ichnun eine Lösung die funktioniert, die ich aber nicht verstehe...
Wer kann mir das erklären? >>A = Udr<< Wenn ich diesen Befehl weglasse ist alles immer 0 - Warum?



'zum empfangen von der seriellen schnittstelle

'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 3686400 'Quarz: 3.6864 MHz
$baud = 9600

Dim A As Integer
Dim B As Integer
Dim C As Integer

Config Pind.0 = Input
Config Pind.3 = Output


Print "ok"

Do


A = Udr ' WENN ICH DIESE ZEILE WEG LASSE GEHT NICHTS MEHR!?

Input B Noecho
Print "out " ; B

'zum testen
C = B + 1
Print "+1: " ; C

Loop

TobiasBlome
21.02.2008, 17:45
Kann es sein, dass der "Input" Befehl den µC ausbremst? oder wartet der bis eine Eingabe kommt?



'Konfiguration µC:

$regfile = "m8def.dat" 'AT-Mega8
$crystal = 8000000 '18432000

$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 8 ' default use 10 for the SW stack
$baud = 38400 '9600

'_________________________________________________ ______________________________
Ddrb = &B11111111 'PortB = Ausgang (PB0=A usw.)
Ddrc = &B111111 'PortC = Ausgang
Ddrd = &B11110011 'PortD = Ausgang (PD0=Anzeige1, PD4=A2, PD5=A3, PD6=A4) PD2/3 =INT

'Config Int0 = Rising 'Falling 'wechsel von High auf Low
'Config Int1 = Rising 'Falling 'wechsel von High auf Low
'Enable Int0
'Enable Int1
'On Int0 Irq0
'On Int1 Irq1


'_________________________________________________ ______________________________
Dim Anzeige_akt As Word 'Aktuelle Zeitmessung
Dim Anzeige_str As String * 5 'Zeit als String
Dim Anzeige_str_len As Byte 'String-Länge
Dim Anzeige_ziffer As String * 1 'Aktuelle Ziffer
Dim Anzeige_pos As Byte 'Aktuelle Ziffer im String
Dim I As Byte 'Allgem. Laufzahl

Dim Test As Word

Dim A As Integer
Dim B As Integer

Dim Zeit As Word
Dim Messzeit As Word 'in Millisekunden
Dim Zeitfake As Word 'damit nicht mit dem Wert 0 gerechnet wird



'_________________________________________________ ______________________________
'TIMER0 Konfiguration für Ziffernwechsel:
Config Timer0 = Timer , Prescale = 1024 '64 '64 -> Timer0 für Anzeige
Const T0_preload = 1 '150 '150 = Startwert Timer0 für 1,2kHz = 300Hz/Anzeige
Tcnt0 = T0_preload

On Timer0 Timer_irq_led 'Timer0-Overflow-Interrupt

Enable Timer0 'Timer0 starten
Enable Interrupts


'_________________________________________________ ______________________________
Zeit = 0 'gemessene Zeit auf 0 setzen
I = 1
B = 0




Do
'Anzeige:
Anzeige_str = Str(anzeige_akt) ' Wert in String umwandeln
Anzeige_str_len = Len(anzeige_str) ' Stringlänge messen

Anzeige_pos = Anzeige_str_len - I
Anzeige_pos = Anzeige_pos + 1

Anzeige_ziffer = Mid(anzeige_str , Anzeige_pos , 1)

Portc = 0 'Ghosting vermeiden (damit nich auf allen Anzeigen die selbe Zahl steht!!!)


Select Case Anzeige_ziffer 'Ziffer auf Port

Case "0" :
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portb.6 = 1
Portb.7 = 1
Portd.5 = 1
Portd.6 = 0
Portd.7 = 0 'NULL

Case "1" :
Portd.2 = 0
Portd.3 = 1
Portd.4 = 1
Portb.6 = 0
Portb.7 = 0
Portd.5 = 0
Portd.6 = 0
Portd.7 = 0 'EINS

Case "2" :
Portd.2 = 1
Portd.3 = 1
Portd.4 = 0
Portb.6 = 1
Portb.7 = 1
Portd.5 = 0
Portd.6 = 1
Portd.7 = 0 'ZWEI

Case "3" :
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portb.6 = 1
Portb.7 = 0
Portd.5 = 0
Portd.6 = 1
Portd.7 = 0 'DREI

Case "4" :
Portd.2 = 0
Portd.3 = 1
Portd.4 = 1
Portb.6 = 0
Portb.7 = 0
Portd.5 = 1
Portd.6 = 1
Portd.7 = 0 'VIER

Case "5" :
Portd.2 = 1
Portd.3 = 0
Portd.4 = 1
Portb.6 = 1
Portb.7 = 0
Portd.5 = 1
Portd.6 = 1
Portd.7 = 0 'FÜNF

Case "6" :
Portd.2 = 1
Portd.3 = 0
Portd.4 = 1
Portb.6 = 1
Portb.7 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 0 'SECHS

Case "7" :
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portb.6 = 0
Portb.7 = 0
Portd.5 = 0
Portd.6 = 0
Portd.7 = 0 'SIEBEN

Case "8" :
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portb.6 = 1
Portb.7 = 1
Portd.5 = 1
Portd.6 = 1
Portd.7 = 0 'ACHT

Case "9" :
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portb.6 = 1
Portb.7 = 0
Portd.5 = 1
Portd.6 = 1
Portd.7 = 0 'NEUN

Case Else :
Portd.2 = 0
Portd.3 = 0
Portd.4 = 0
Portb.6 = 0
Portb.7 = 0
Portd.5 = 0
Portd.6 = 0
Portd.7 = 0

End Select

'Segment wählen
If I = 1 Then Portc.1 = 1 'EINER
'If I = 2 Then Portc.2 = 1 'ZEHNER
If I = 2 Then
Portc.2 = 1 'ZEHNER
Portd.7 = 1 'EINE Kommastelle
End If
If I = 3 Then Portc.3 = 1 'HUNDERTER
If I = 4 Then Portc.4 = 1 'TAUSENDER

I = I + 1 'Nächste Ziffer
If I >= 5 Then I = 1 'max Anzeigen angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden)


'ENDE ANZEIGE




Anzeige_akt = B 'Wert zum anzeigen



Loop





'_________________________________________________ ______________________________
Timer_irq_led:


Tcnt0 = T0_preload 'Timer wieder laden

A = Udr 'Byte aus UART auslesen
Input B Noecho 'über RS232 empfangen
Print "out " ; B


Return

'-------------------------------------------------------------------------------
'Anschlussbelegung am AT-MEGA8
'-------------------------------------------------------------------------------

'Segment A = PD2 (rote Ader)
'Segment B = PD3
'Segment C = PD4
'Segment D = PB6
'Segment E = PB7
'Segment F = PD5
'Segment G = PD6
'Segment DP = PD7

'Zahl 1 = PC1 ganz rechts EINER (rote Ader)
'Zahl 2 = PC2 2.Stelle von Rechts ZEHNER
'Zahl 3 = PC3 3.Stelle von Rechts Hunderter
'Zahl 4 = PC4 4.Stelle von Rechts Tausender