- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte
Ergebnis 41 bis 50 von 52

Thema: 40 Khz Frequenz erzeugen Ultraschallsender

  1. #41
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    35
    Beiträge
    718
    Anzeige

    E-Bike
    So das ist der aktuelle Stand:

    Code:
    $regfile = "m8def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising       'Timer1 für emfang
    Disable Timer1
    On Timer1 Timer1_isr
    
    Config Portb.3 = Output                                     'Port für Pulsausgabe
    
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portc.2 , Rs = Portc.3
    Config Lcd = 16 * 2
    Cls
    Cursor Off
    
    '/////////Sub Deklarieren\\\\\\\\\\\\\
    Declare Sub Send_puls(byval Ms As Byte)
    
    Dim I As Double
    I = 0
    
       Call Send_puls(3)
       Enable Timer1
       Enable Interrupts
       Wait 2
       Lcd I
    
    End
    
    Sub Send_puls(byval Ms As Integer)                          'Timer2
       $asm
       push r16
       ldi r16,26
       Out Tccr2 , R16
       ldi r16,25
       Out Ocr2 , R16
       pop r16
       $end Asm
    
       Waitms Ms
    
       $asm
       push r16
       clr r16
       Out Tccr2 , R16
       pop r16
       $end Asm
    End Sub
    
    Timer1_isr:
       Incr I
    Return
    Leider nörgelt meine alte Bascom Version noch rum, un meine Update ist noch nicht freigeschaltet...
    RGB-IR-Lampe, Catwiesel Bot, PC Terminal, Schrittmotoransteuerung, Elektroschocker, Stundenplan... www.stefan-reible.de

  2. #42
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hallo Lenox,
    Sieht schon mal gut aus, würde ich mal sagen nur was ist das für ein Interrupt:

    On Timer1 Timer1_isr
    Overflow Interrupt ?
    Timer 1 hat mindestens 4 Interrupts Du brauchst den Capture Interrupt und zwar so:
    -Puls an
    -warten
    -puls aus
    -Timer1 reseten
    -Timer1 starten
    -Bei steigender Flanke wird der Capture Interrupt ausgelöst in dem Du
    -Capture Register (Zeitstempel, wann die Flanke kam) auslesen
    -Timer 1 stopen
    -signalisieren daß Du Fertig bist
    -in der hauptschleife die Capture werte verschicken.

    Fertig,
    versuch das mal, wenn Du nicht weiter kommst melde Dich

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #43
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    35
    Beiträge
    718
    Hi,
    ich hab das von der Logik alles verstanden
    Das steht soweit auch alles oben im Code, nach dem senden wird der Timer1 gestartet, der bei jeden Durchlauf (Prescaller von 1) I um eins erhöht.
    Bei steigender Flanke soll dann ein Capture Interrupt den Timer1 wieder stoppen.
    Anschließend hab ich in I die Anzahl der Durchläufe.

    Das Problem ist, dass ich es einfach nicht programmiert bekomme das bei steigender Flanke der Timer1 wieder gestoppt wird.
    Ich saß gestern Abend noch Stundenlang mit nem Kumep daran, aber wir haben es einfach nicht hinbekommen :/

    Ich weiß leider nicht weiter, ich wüsste auch sonst keinen der davon richtig Ahnung hat (bzw sich hier mal meldet).
    RGB-IR-Lampe, Catwiesel Bot, PC Terminal, Schrittmotoransteuerung, Elektroschocker, Stundenplan... www.stefan-reible.de

  4. #44
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    35
    Beiträge
    718
    Grad noch mal mit Bascom rumgespielt:

    Do
    Pulseout Portb , 1 , 50
    Waitus 11
    Loop

    erzeugt auch ne 40Khz Frequenz
    RGB-IR-Lampe, Catwiesel Bot, PC Terminal, Schrittmotoransteuerung, Elektroschocker, Stundenplan... www.stefan-reible.de

  5. #45
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Das Problem ist, dass ich es einfach nicht programmiert bekomme das bei steigender Flanke der Timer1 wieder gestoppt wird.
    Du hast ja nur den Overflow Interrupt in Deinem Programm drin !
    Mal angenommen Deine Hardware liefert eine saubere Flanke und
    Code:
    Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising
    capture unit einschaltet, die bei einer steigenden Flanke einen Zeitstempel macht, brauchst Du noch den entsprechenden Counter1 Capture Event Interrupt, wo der µC auch hinspringen kann, wenn die Flanke gekommen ist.
    Dort kannst Du dann ruhig den Timer 1 stopen und die Captureregister auslesen...
    Es handelt sich um Vektor 5, wenn es Dir helfen sollte, irgendwie wird der ja bei Basic genannt sein...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #46
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    35
    Beiträge
    718
    Hi,
    ich glaub ich hab es jetzt, aber mit nem ganz normalem Interrupt der den Timer beendet.
    Leider kann ich es nicht ausprobieren da ich total sinnlose Fehler erhalte.
    Ich glaub das liegt an meiner alten Bascom Version (beim Kumpel geht das Compilieren).
    Mein Update Acc ist leider noch immer nicht freigeschaltet :/

    Hier der Code, ich hoffe er ist zu verstehen:
    Code:
    $regfile = "m8def.dat"
    $crystal = 16000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portc.2 , Rs = Portc.3
    Config Lcd = 16 * 2
    Cls
    Cursor Off
    
    Config Portb.3 = Output
    
    Dim I As Double
    
    Config Timer1 = Timer , Prescale = 1                        'Zählt Variable in ISR hoch
    Disable Timer1
    On Timer1 T1_isr
    
    Config Int0 = Rising                                        'bei steigender Flanke
    Disable Int0
    On Int0 Int0_isr
    
    Do
    
       $asm
       push r16
       ldi r16,26
       Out Tccr2 , R16
       ldi r16,25
       Out Ocr2 , R16
       pop r16
       $end Asm
    
       Waitms 2
    
       $asm
       push r16
       clr r16
       Out Tccr2 , R16
       pop r16
       $end Asm
    
       I = 0
       Enable Interrupts
       Enable Timer1
       Enable Int0
    
       Wait 2                                                   'Programm wartet und Interrupts laufen
    
       Lcd I                                                    'Ausgabe auf LCD
       Waitms 500
       Cls
    
    Loop
    
    T1_isr:                                                     'I wird imemr um eins erhöht
       Incr I
    Return
    
    Int0_isr:                                                   'bei steigender Flanke schaltet die ISR vom Interrupt alles ab
       Disable Interrupts
       Disable Timer1
       Disable Int0
    Return
    
    End
    RGB-IR-Lampe, Catwiesel Bot, PC Terminal, Schrittmotoransteuerung, Elektroschocker, Stundenplan... www.stefan-reible.de

  7. #47
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Ja gut mit externen Interrupt geht es ja auch.
    Wenn es brauchbare Werte liefert ist dann alles in Butter

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #48
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    40
    Beiträge
    647
    Hi,

    sry das ich diesen alten Thread wieder hoch hole, aber ich hätte da noch eine Frage.

    Ich muss mit einem ATmega8 eine Frequenz von 38kHz erzeugen.
    Ich habe mal kurz in ein Assembler Tutorial reingeschaut und weiss jetzt ungefähr wofür push, ldi und out steht. Allerdings verstehe ich die Wirkungsweise noch nicht ganz.

    Kann ich auch für TCCR2 und OCR2 die von PB1 nehmen? Also TCCR1 und OCR1?

    Muss ich nur die "25" ändern oder auch die "26" um meine Frequenz auf 38kHz zu bekommen?
    Die Formel zur Berechnung war ja weiter oben schon angegeben, demnach müsste ich ja die 25 in eine 13 ändern, mein Prozessor läuft auf 8Mhz. Wenn ich nicht genau 38kHz erwische ist das nicht so wild (vermute ich jedenfalls momentan)
    Code:
    $asm
       push r16
       ldi r16,26
       Out Tccr2 , R16
       ldi r16,25
       Out Ocr2 , R16
       pop r16
       $end Asm
    
       Waitms 2
    
       $asm
       push r16
       clr r16
       Out Tccr2 , R16
       pop r16
       $end Asm
    Der ablauf des Codes wäre doch hier:
    Toggle für 2ms mit 40kHz oder?

    Danke
    MFG Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  9. #49
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Assembler kann ich nicht, aber da das hier ja eigentlich auch das Bascom Forum ist, schreibe ich mal wie man die Frequenz von 38kHz damit erzeugen kann.


    Code:
    $crystal = 8000000
    Config Timer0 = Timer, Prescale = 1
    On Timer0 Timerroutine
    Enable Timer0
    Enable Interrupts
    Timerroutine:
      Timer0 = 45
              'diese Routine wird knapp 37900 mal pro Sekunde aufgerufen
       Return
    Wenn du die Timerroutine doppelt so oft aufrufst, sprich 76000 mal pro Sekunde und in der Routine einfach nur einen Pin toggles hast du an dem Pin ein Rechtecksignal mit ca. 38 khz
    Dafür musst du in obigem Code nur "Timer0 = 45" durch Timer0 = 151" ersetzen und in die Timerroutine ein "Toggle Pinx.x" einfügen.

    Mit Timer1 geht das natürlich auch, da das ein 16bit Timer ist, ergeben sich dafür allerdings andere Zahlenwerte.

  10. #50
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    40
    Beiträge
    647
    Hi,

    danke für den Code. Ich würde gerne die Berechnung dazu nachvollziehen können. Kannst du mir da noch ein paar Infos zu geben?

    Ich möchte jetzt nicht das mein Programm die ganze Zeit nur die 38kHz raushaut. Kann man das auch so machen das ich ihm eine bestimmte Zeit gebe in der er das machen soll?

    Deswegen finde ich die Assembler Lösung schöner, da "schaltet" man das ja einfach nur an und nach ner bestimmten Zeit wieder aus. Oder sehe ich das falsche?

    Danke
    MFG Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests