magluh
10.11.2004, 17:01
SoftwareFehler bei BASCOM AVR Basic, Befehl: Shiftin ????
BASCOM AVR Compiler : Version 1.11.7.4 , DEMO
Ich möchte Daten von einem externen Gerät mit TTL Interface
in den ATmega8 einlesen.
Das TTL Interface liefert 2 Signale, das DatenSignal (DP) und den Takt (CP).
Es sollen die Daten (DatenBit) mit fallender Flanke (H/L) des TaktSignals eingelesen
werden. Allerdings scheint hier etwas nicht zu stimmen (???).
Werden die Daten (DatenBit) mit steigender Flanke (L/H) eingelesen, so ist alles OK.
Fallende Flanke: nicht OK
Steigende Flank: OK
Das DatenBit wird nicht richtig eingelesen, wenn das TaktSignal
von H/L geht (Optionen 4, 6).
Bei den Optionen 5 und 7 ist alles OK. Hier geht das TaktSignal
von L /H.
Der Fehler tritt nur bei der Datenübernahme auf, wenn das TaktSignal
von H/L geht.
.................................................. .................................................. ......
Da etwas nicht stimmt, habe ich mir eine kleine TestSchaltung aufgebaut.
Das DatenSignal wird einfach durch Anlegen der entsprechenden Spannungen
5 V (H) oder GND (L) erzeugt.
Das TaktSignal wird durch eine einfache Lichtschranke erzeugt, die einfach mittels
Finger unterbrochen wird, um ein prellfreies Signal zu erhalten.
( Siehe Code ganz unten )
Verbindung zum ATmega8:
DP ( DATA pulse) an Pind.5
CP ( CLOCK pulse) an Pind.6
Test 1 :
Option : 4
RESET
Pind.5 ( DP , DATA ) auf HIGH (5 Vcc)
CP (CLOCK) 5 Takte eingegeben
Ich erwarte 00011111 , Ich erhalte 00011111 (das ist OK)
dann sofort anschließend
Pind.5 ( DP , DATA ) auf LOW ( 0 Vcc) setzen
CP (CLOCK) abermals 5 Takte
Ich erwarte 00000000 , Ich bekomme aber 00010000 (nicht OK , warum 1 und nicht 0).
Der DatenPin (Pind.5) war die ganze Zeit auf Low. Folglich dürfte keine 1 auftauchen.
Test 2 :
Option : 6
RESET
Pind.5 ( DP , DATA ) auf LOW (0 Vcc)
CP (CLOCK) 5 Clock-Impulse
Ich erwarte 00000000 , Ich bekomme 00000000 (das ist OK)
dann sofort anschließend
Pind.5 ( DP , DATA ) auf HIGH ( 5 Vcc) setzen.
CP (CLOCK) 5 Clock-Impulse.
Ich erwart 11111000 , Ich erhalte 11110000 (nicht OK , eine 1 fehlt, warum 0 statt 1 )
Der DatenPin (Pind.5) war die ganze Zeit auf High. Es dürfte keine 0 auftauchen.
CP (CLOCK) erneut 5 Clock-Impulse
Ich erwarte 11111000 , Ich erhalte 11111000 ( das ist OK , keine 1 fehlt )
Test 3 oder 4
Option : 5 oder 7
Ich bekomme, was ich erwartet habe. Option 5 und 7 sind OK.
Es gibt hier keinen Fehler.
Schlussfolgerung
Der Befehl arbeitet immer dann fehlerhaft, wenn das TaktSignal von H nach L geht (Option 4, 6).
Der Befeh arbeitet immer dann fehlerfrei, wenn das TaktSignal von L auf H geht (Option 5, 7).
Frage: Ist der Compiler fehlerhaft oder mache ich einen Fehler ?
Kann mir jemand helfen ?
Luhmer
luhmerm@t-online.de
.................................................. ..............
'Test: SHIFTIN
'
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Config Serialout = Buffered , Size = 255
Dim A As Byte
Config Pind.5 = Input ' DP (DATA Pulse)
Config Pind.6 = Input ' CP (CLOCK Pulse)
Portd = &B11111111
Do
A = 0
Shiftin Pind.5 , Pind.6 , A , 6 , 5 ' Option: 5 oder 7 OK , 4 oder 6 nicht OK
Print Bin(a)
Loop
End
.................................................. ............
BASCOM AVR Compiler : Version 1.11.7.4 , DEMO
Ich möchte Daten von einem externen Gerät mit TTL Interface
in den ATmega8 einlesen.
Das TTL Interface liefert 2 Signale, das DatenSignal (DP) und den Takt (CP).
Es sollen die Daten (DatenBit) mit fallender Flanke (H/L) des TaktSignals eingelesen
werden. Allerdings scheint hier etwas nicht zu stimmen (???).
Werden die Daten (DatenBit) mit steigender Flanke (L/H) eingelesen, so ist alles OK.
Fallende Flanke: nicht OK
Steigende Flank: OK
Das DatenBit wird nicht richtig eingelesen, wenn das TaktSignal
von H/L geht (Optionen 4, 6).
Bei den Optionen 5 und 7 ist alles OK. Hier geht das TaktSignal
von L /H.
Der Fehler tritt nur bei der Datenübernahme auf, wenn das TaktSignal
von H/L geht.
.................................................. .................................................. ......
Da etwas nicht stimmt, habe ich mir eine kleine TestSchaltung aufgebaut.
Das DatenSignal wird einfach durch Anlegen der entsprechenden Spannungen
5 V (H) oder GND (L) erzeugt.
Das TaktSignal wird durch eine einfache Lichtschranke erzeugt, die einfach mittels
Finger unterbrochen wird, um ein prellfreies Signal zu erhalten.
( Siehe Code ganz unten )
Verbindung zum ATmega8:
DP ( DATA pulse) an Pind.5
CP ( CLOCK pulse) an Pind.6
Test 1 :
Option : 4
RESET
Pind.5 ( DP , DATA ) auf HIGH (5 Vcc)
CP (CLOCK) 5 Takte eingegeben
Ich erwarte 00011111 , Ich erhalte 00011111 (das ist OK)
dann sofort anschließend
Pind.5 ( DP , DATA ) auf LOW ( 0 Vcc) setzen
CP (CLOCK) abermals 5 Takte
Ich erwarte 00000000 , Ich bekomme aber 00010000 (nicht OK , warum 1 und nicht 0).
Der DatenPin (Pind.5) war die ganze Zeit auf Low. Folglich dürfte keine 1 auftauchen.
Test 2 :
Option : 6
RESET
Pind.5 ( DP , DATA ) auf LOW (0 Vcc)
CP (CLOCK) 5 Clock-Impulse
Ich erwarte 00000000 , Ich bekomme 00000000 (das ist OK)
dann sofort anschließend
Pind.5 ( DP , DATA ) auf HIGH ( 5 Vcc) setzen.
CP (CLOCK) 5 Clock-Impulse.
Ich erwart 11111000 , Ich erhalte 11110000 (nicht OK , eine 1 fehlt, warum 0 statt 1 )
Der DatenPin (Pind.5) war die ganze Zeit auf High. Es dürfte keine 0 auftauchen.
CP (CLOCK) erneut 5 Clock-Impulse
Ich erwarte 11111000 , Ich erhalte 11111000 ( das ist OK , keine 1 fehlt )
Test 3 oder 4
Option : 5 oder 7
Ich bekomme, was ich erwartet habe. Option 5 und 7 sind OK.
Es gibt hier keinen Fehler.
Schlussfolgerung
Der Befehl arbeitet immer dann fehlerhaft, wenn das TaktSignal von H nach L geht (Option 4, 6).
Der Befeh arbeitet immer dann fehlerfrei, wenn das TaktSignal von L auf H geht (Option 5, 7).
Frage: Ist der Compiler fehlerhaft oder mache ich einen Fehler ?
Kann mir jemand helfen ?
Luhmer
luhmerm@t-online.de
.................................................. ..............
'Test: SHIFTIN
'
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
Config Serialout = Buffered , Size = 255
Dim A As Byte
Config Pind.5 = Input ' DP (DATA Pulse)
Config Pind.6 = Input ' CP (CLOCK Pulse)
Portd = &B11111111
Do
A = 0
Shiftin Pind.5 , Pind.6 , A , 6 , 5 ' Option: 5 oder 7 OK , 4 oder 6 nicht OK
Print Bin(a)
Loop
End
.................................................. ............