Archiv verlassen und diese Seite im Standarddesign anzeigen : Flankenerkennung mit Bascom
sebastian.heyn
04.11.2004, 14:54
Sorry das ich so blöde fragen stelle *G*
Gibt es in Bascom eine einfache function um einen Wechsel von high nach low bzw umgedreht zu erkennen?
Ja den Interrupt, dann wird dein programm unterbrochen und es beginnt ein Unterprogramm, wo dann z.B. +1 gezählt wird oder so.
Du kannst beim interrupt den edge einstellen Rising/falling, je nachdem welche Flanke du willst.
hab grad kein beispiel parat, aber wenn du willst, kann ichs mal posten.
MFG Moritz
sebastian.heyn
04.11.2004, 15:18
mmhh also eigentlich habe ich folgendes vor.
ein eingang ist high, jetzt warte ich bis der andere eingang von high auf low fällt. (ähnlich startbedingung I2C). danaclh sind 10µsec pause dann habe ich einen takt von je 5µsec high und low. wärend jedem high muss die datenleitung gelesen werden. pause zwischen verschiedenen bytes sind 180µsec.
Kann man interrupts logisch verknüpfen?
und wenn kann ich wärend des einen interrupts einen anderen interruptpin abfragen?
Ich hoffe das meine fragen nicht zu unverständlich formuliert sind...
das kannste aber auch mit bitwait machen...
das wartet bis nen bit über nen eingang reinkommt oder
shiftin
Martin
sebastian.heyn
04.11.2004, 15:33
Also ganz einfach:
do
wenn int0=hi and int1=falling dann call whatever
sub whatever
do
wert=0
for zähler=7 to 0 step-1
wenn int0=rising and int1=high dann wert=wert+2^zähler
next
dann wird der wert in ein array geschrieben (an die stelle xy ungelöst)
loop until int0=hi and int1=rising
end sub
so ungefähr. um das mal nicht mit meinen worten auszusprechen
sebastian.heyn
04.11.2004, 15:43
mit shiftin müsste das gehen, glaube ich. da kann ich mir ja die berechnuung sparen, oder? da wenn ich es richtig verstanden habe shiftin ein byte clockbezogen auslesen kann
sebastian.heyn
04.11.2004, 22:26
MMHH ich kriege nicht hin den datenstrom richtig auszulesen.
Also bustakt ist so ca 120khz (gemessen am Clock), deshalb schließe ich aus das der mega128 mit 16Mhz zu langsam ist und deshalb bits "überliest". Ich habe mal ein diagramm des protokolls angehangen. es ist sehr an I2c angelehnt. Hat jemand ne Idee? die startbedingung erkenne ich über datenleitung=interrupt=falling und Clock=high (das tritt nur zu diesem zeitpunkt auf) aber der rest gestaltet sich schwierig auszulesen.
Dino Dieter
04.11.2004, 22:44
Hallo
Wenn du genug Resourcen frei hast, kannst folgendes machen.
Daten auf INT0
clock auf INT1
Daten INT0 einschalten, wenn der INT0 kommt, schaltest du im INT0 den INT 1 ein und INT 0 aus. ( Startbedingung)
Dann kommt der nächste INT1 bei der steigenden Flanke von Clock, kurz warten 1 oder 2 NOP, und Daten einlesen ( 0 oder 1), nach 8 Bits INT1 aus, INT 0 ein und von vorne.
Sollte so klappen aber denke daran, ein Sprung in den INT braucht auch ca 12 Takte rein und ca 12 Takte raus.
MFG
Dieter
sebastian.heyn
04.11.2004, 22:49
danke, wusste nicht das ich wärend eines laufenden programmes auch ints disablen kann. das hilft mir sehr weiter!
sebastian.heyn
05.11.2004, 10:15
...mmhh ist der avr zu langsam? ich bekomme bei gleichem eingangsimpuls kein gleichmäßiges ergebniss. Habe versucht es so gut wie möglich zu kommentieren
$regfile = "m128def.dat"
$crystal = 16000000
$baud = 57600
Config Portd = Input
Portd.1 = 1 'Pullup an PD1 aktivieren
Portd.3 = 1 'pullup an pd3 aktivieren
'Config SCL = Portd.1 'A18 WEIß / INT1 RISING
'Config SDA = Portd.3 'a20 GRAU / INT3 FALLING
On Int1 Readbyte
Config Int1 = Rising
On Int3 Startchk
Config Int3 = Falling
Enable Interrupts
Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim Arr(33) As Integer
'=============HAUPTPROGRAMM==============
For A = 1 To 9 'array leer machen
Arr(a) = 0
Next
A = 1 'Zähler auf eins setzen
print "Programmstart"
Enable Int3 'Los gehts
Do
Arr(a) = B 'Array(zähler)=wert ->> wird in int1 vergeben
If A = 32 Then
Disable Int1 ' erstma nix mehr interrupten
For C = 1 To 32
Print Arr(c); 'array ausgeben
Next
Print ""
A = 1 'Zähler auf eins zurücksetzen
Enable Int3 ' und wieder aufs fallende datenbyte warten
End If
Loop
'==========================================
'============INT3 Routine================
Startchk:
If Pind.1 = 1 Then
Disable Int3 'Startbedingung -> Kein interrupt von Data
Enable Int1 'Dafür von clock
End If
Return
'=======================================
'============INT1 Routine===============
Readbyte:
B = 0
If Pind.3 = 1 Then B = 1 'Datenbit=1'
A = A + 1 'Zähler um eins erhöhen
Return
End
Ausgabe des terminals:
00011100000000010000000000010010
00011100000000010000000000000010
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000010011
00011100000000010000000000010011
00011100000000010000000000010011
00011100000000010000000000000011
00011100000000010000000000010011
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000010011
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000000010
00011100000000010000000000000010
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000010010
00011100000000010000000000000010
00011100000000010000000000010010
00011100000000010000000000010011
00011100000000010000000000010011
am anfang scheint alles gleichmäßig zu laufen, nur nach hintenwirds "instabil".
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.