- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: Flankenerkennung mit Bascom

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370

    Flankenerkennung mit Bascom

    Anzeige

    Powerstation Test
    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?

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    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...

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    36
    Beiträge
    1.614
    das kannste aber auch mit bitwait machen...

    das wartet bis nen bit über nen eingang reinkommt oder

    shiftin

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    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

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    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

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370

    Shiftin nicht das richtige?

    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.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken prot.jpg  

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    58
    Beiträge
    247
    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

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    danke, wusste nicht das ich wärend eines laufenden programmes auch ints disablen kann. das hilft mir sehr weiter!

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    ...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".

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen