ich habe ihn derzeit mit dem internen 1mhz getaktet.
1. muss ich die taktrate ändern, damit ich mit 19200 baudrate arbeiten kann?
2. wenn ja, auf wieviel mhz?
3. wie stell ich das an?
danke,
xeus
Druckbare Version
ich habe ihn derzeit mit dem internen 1mhz getaktet.
1. muss ich die taktrate ändern, damit ich mit 19200 baudrate arbeiten kann?
2. wenn ja, auf wieviel mhz?
3. wie stell ich das an?
danke,
xeus
Hallo,
wie sollte man denn die Serielle Schnittstelle einstellen damit das Gerät auch so empfängt wir der AVR sendet,
also ich mein jetzt nicht nur wieviel Baud, sondern auch den Rest wie Stoppbit, Parität, anzahl Bits usw. ?!
guten abend zusammen,
also lass deinen Takt mal von einem externen Quarz machen. Saubere Taktraten lassen sich unter anderem aus folgenden Quarzfrequenzen generieren:
3,6863Mhz
14,7456MHz
zum erstgenannten noch 33p Bürdekapazitäten und dann müsste das funktionieren. Tut es auf jeden Fall bei mir ;)
greetzle brat
und ach ja
serielle schnittstelle 8N1 also 8 bits, keine parität, und 1 stopbit
Das war aber aus deinem Code nicht zu ersehen.Zitat:
ha, ha, ha
das hab ich doch gemacht. nur an der empfangsseite kommt es verfälscht an.
Also wenn du die Zeilen:
$crystal=1000000 und
$baud=19200
und der Taktgenerator auf 1MHz steht (fusebits einstellen !, wobei ich nicht weiß, welche Settings der Mega 8 kann.)
dann sollte es funktionieren.
Du kannst Bascom auch eine andere Baudrate vorgaukeln...
mach' crystal = geteilt durch 4, dann kommst du auch auf 19200,
wenn du vorher 4800 hattest. ;)
Funzt zwar, ist aber Quatsch, denn entweder ist dein Takt falsch in den Fusebits eingestellt, oder die Taktfrequenz falsch in Bascom eingegeben.
Gruß
Christopher
Also ich habs ets hinbekommen, das mein m16 mit 16Mhz läuft. und bei einer baudrate von 19200 mit dem gerät kommuniziert.
ich hab die kommunikation wie oben beschrieben realisiert, nun will ich das er das 2.empfangene Byte mit der Zahl 6 vergleicht, und mir 'fehler' bzw. 'kein fehler' über das uart ausgibt.
wenn ich im nun als 2.Byte eine 6 sende, gibt er kein fehler aus, und bei einer zahl ungleich 6 fehler. was so weit je schon mal gut ist. aber wiederhole ich diesen vorgang gibt er immer fehler aus.Code:Sub Status
if Packete(2)= 6 then
print 'kein Fehler'
else
print 'Fehler'
return
end sub
woran kann das liegen?
mfg
xeus
Kannst du den aktuellen Code reinstellen ?
Hier der code, wie gesagt ich empfange ein packet mit 8 bytes, davon soll er das 2. mit '006' vergleichen.
desweiteren hab ich noch ein Problem mit der Checksummen berechnung, er läst mich bei einer bitverschiebung das ergebnis nicht in eine seperate variable schreiben.
wär nett wenn mir jemand helfen könnte das mit dem vergleich und der checksumme hintzkriegen.Code:
$regfile = "m16def.dat"
$crystal = 20000000 'Quarz: 3.6864 MHz
$baud = 19200
Dim I As Byte
Config Lcdpin = Pin , Db4 = Porta.6 , Db5 = Porta.5 , Db6 = Porta.4 , Db7 = Porta.3 , E = Porta.7 , Rs = Porta.2 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus)
Dim A As Byte
Config Lcd = 20 * 4 'Baudrate der UART: 9600 Baud
Config Pind.1 = Input
Config Pind.0 = Output
Config Pind.5 = Output
Config Pind.2 = Input
Dim Clc_l As Byte
Dim Clc_h As Byte
Dim New , New1 , New2 , New3 As Byte
Dim Tmp As Byte
Dim Bcclo As Byte
Dim Bcchi As Byte
Dim X As Byte
Dim Packets(10) As Byte
Dim Packete(8) As Byte
Declare Sub Sendewr
Declare Sub Empfangewr
Declare Sub Clc
Declare Sub Lcdout
Declare Sub Status
Dim Line1 As String * 20
Dim Line2 As String * 20
Dim Line3 As String * 20
Dim Line4 As String * 20
'PowerLED
Portd.5 = 1
'Init Packets
Packets(1) = 002
Packets(2) = 050
Packets(3) = 000
Packets(4) = 032
Packets(5) = 032
Packets(6) = 032
Packets(7) = 032
Packets(8) = 032
Packets(9) = 9
Packets(10) = 10
'LCD init
Initlcd
Line1 = "test"
Line2 = " S T A R T!"
Line3 = " com"
Line4 = "www.ich.de"
Gosub Lcdout
Do
'Taster 1
If Pind.2 = 1 Then
Line2 = " reset"
Line3 = " com"
Print "reset"
Gosub Lcdout
End If
'Taster 2
If Pind.4 = 1 Then
Gosub Sendewr
Gosub Empfangewr
'Gosub Status
End If
Loop
'SUBs
'Anfrage an WR stellen
Sub Sendewr
Line2 = " sende Anfrage"
Line3 = " com"
Printbin Packets(1) ; 10
Gosub Lcdout
'Gosub Clc
Return
End Sub Sendewr
'Status vom WR empfangen
Sub Empfangewr
Line2 = " warte auf Daten"
Gosub Lcdout
Inputbin Packete(1) , 8
Gosub Status
Return
End Sub Empfangewr
'Checksumme berechnen
Sub Clc
'Init
Bcclo = &H0XFF 'setze high
Bcchi = &H0XFF 'setze high
New = &B11011001 'lade byte
New = New Xor Bcclo
Tmp = Shift New , Left , 4 'Fehlermeldung
New = Tmp Xor New
Tmp = Shift New , Right , 5 'Fehlermeldung
Bcclo = Bcchi 'setze gleich
Bcchi = New Xor Tmp
Tmp = Shift New , Left , 3 'Fehlermeldung
Bcclo = Bcclo Xor Tmp
Tmp = Shift New , Right , 4 'Fehlermeldung
Bcclo = Bcclo Xor Tmp
'Gosub Lcdout
Return
End Sub Clc
'LCD Ausgabe
Sub Lcdout
Cls
Locate 1 , 1 '1. Zeile
Lcd Line1
Locate 2 , 1 '2. Zeile
Lcd Line2
Locate 3 , 1 '3. Zeile
Lcd Line3
Locate 4 , 3 '4. Zeile
Lcd Line4
Return
End Sub
'Status Auswertung
Sub Status
If Packete(2) = 006 Then 'Vergleich ob das 2.Byte den wert 6 trägt
Line3 = "kein Fehler"
Print "kein fehler"
Else
Line3 = " Fehler"
Print "fehler"
End If
Gosub Lcdout
Return
End Sub Status
End 'end program
mfg
xeus
Moddy: Code-Tags ausgebessert
mein Bascom ist aus mehreren Gründen stinkesauer mit deiner source
dim new, new1, .. as byte nimmt er nicht, das braucht er einzeln
SHIFT hat keinen output-parameter. das Feld wird geshiftet, bleibt aber, wo es ist.
wenn du sowas willst wie
Tmp = Shift New , Left , 4
muttu schreiben:
Tmp = New
Shift Tmp, Left , 4
Welche Art Checksum ist das ? (nur informativ)
Fehler Pakete(2)
Schau mal, ob der Sender nicht vielleicht <CR><LF> nach den 8 byte dazusendet.
Egal, überprüfe den input:
nach
inputbin pakete(1), 8
machst du
Print str(pakete(1)) ;str(pakete(2)) ;...str(pakete(8))
dann siehst du, was effektiv drinsteht und kannst dir vielleicht einen Reim drauf machen
erstmal danke, für deine hilfe.
bei der CRC handelt es sich um ein CCITT standrisiertes CRC Polynom:
mit 2Bytes BccLo & Bcchi
also, das mit XOR ist schon mal kein Problem.Zitat:
Bn=N^16+N^12+N^5+Bn-1
A. Init BccLo=0xFF, BccHi=0xFF
B. Für jedes Byte das gesendet und empfangen wird
new=new XOR BccLo
tmp=new<<4
new=tmp XOR new
tmp=new>>5
BccLo=BccHi
BccHi=new XOR tmp
tmp=new<<3
BccLo=BccLo XOR tmp
tmp=new>>4
BccLo=BccLo XOR tmp
C. Negieren Bit by Bit BccLo & BccHi: CLC_L=~BccLo CLC_H=~BccHi
das mit dem bitverschieben müsste eigentlich auch möglich sein. das problem ist nur den wert in die entsprechende variable zu übertragen.
Also mein sender hängt defenetiv keine bytes oder bits dran, denn bei dem sender handelt es sich um ein selbstgeschriebenes programm, sendet genau 6 bytes + 2bytes CLC_L,CLC_H
Noch eine zusätzliche Fragen:
wenn ích die bytes empfange (input packet(1)...)
muss es doch möglich sein z.b. das 2. byte mit einem vorgegebenen wert zu vergleichen, und daraufhin eine reaktion auszuführen.
gruß
xeus
Wegen dem 2. Byte: Ich hab ja gesagt, mach nach dem Empfang der 8 Byte ein print mit allen Zeichen.
Da werden irgendwelche verschiebungen stattfinden. da du ja weißt, was du schickst, kannst du daraus dann das Problem einkreisen