PDA

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?

RCO
04.11.2004, 14:58
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...

x-ryder
04.11.2004, 15:30
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".