Heute habe ich angefangen

  • Es geht richtig los mit den üblichen Albernheiten, aus denen man so viel lernt:


    1. Versuch in Asselmbler: Ein ´Lauflicht - abgehakt, AVR Assembler erinnert mich stark an meine 25 Jahre alten Versuche mit dem 6502.
    2. Versuch mit Bascom: rot, grün, gelb im 3 Sekunden Takt, im LCD Display wird angesagt dass im Moment die rote / gelbe / grüne LCD leuchtet 8)


    Nicht vom Stuhl fegend, aber lehrreich. Jetzt muss ich zum Geburtstag, morgen werde ich einen Drehgeber als Steuerelement einbauen und die bunten Lampen / das Display mit dem Drehgeber steuern.

    73/2 de Peter, DL2FI
    Proud member of Second Class Operators Club SOC and Flying Pig Zapper #OOO (Certificated Kit Destroyer)

  • Hallo Peter,


    das ist doch schon mal ein großes Erfolgserlebnis! :)


    Wenn Du Codeschnipsel für die Drehgeberansteuerung brauchst... Damit hab ich mich in den letzten Tagen beschäftigt, wegen einer Ofensteuerung. Sah trivial aus, aber der Kram hat es offensichtlich in sich :(


    Also viel Erfolg und Durchhaltevermögen für die nächsten Experimente! :)

    73 de Stefan DK6TM


  • Ich bitte darum 8)


    Das ist ja - so in Etwa - genau meine Idee. Ich habe eingesehen, dass ich niemanden finden werde, der das komplette Projekt entwickelt. Ich gehe aber davon aus dass es kein Problem sein wird zu speziellen Fragen Hilfestellung zu bekommen und / oder kleine Module, die bestimmte Sachen optimieren oder realisieren.

    73/2 de Peter, DL2FI
    Proud member of Second Class Operators Club SOC and Flying Pig Zapper #OOO (Certificated Kit Destroyer)

  • Hallo Peter,


    welches Projekt? :)


    Ich habe hier die Drehgeber-Ansteuerung mit einer Interruptroutine gelöst (also nicht mit dem Bascom-Befehl (ENCODER). Die Encoder Routine hat nur mehr sporadisch richtig funktioniert, deshalb hatte ich da keine Lust auf Experimente. Was mir letztendlich weitergeholfen hat, war ein Codeschnipsel aus dem Roboternetz.


    Die Interrupt-Routine sieht folgendermaßen aus (ich habe daran praktisch nichts verändert):


    Code
    Enable Interrupts                      ' Interrupts einschalten
      Config Int0 = Falling              ' Fallende Flanke an INT0 abfragen, der Drehgeber liegt an Masse und der Pullup am entsprechenden Port ist aktiviert
      Enable Int0                             ' Jetzt auch noch INT0 einschalten
    On Int0 Prog                            ' "Prog" ist die Interruptroutine zu der bei Aufrufen des INT0 gesprungen wird.


    Die Interruptroutine selbst sieht dann folgendermaßen aus:


    Code
    Prog: 
    Waitus 200                                               'Wichtig, da das D-FF erst nach einem Takt die Richtung aktualisiert
       If Pinc.1 = 0 Then                                 ' Zweiter Pin des Drehgebers
          incr Wert                                            ' Drehrichtung rechts; Wert erhöhen  
        Else
             decr Wert                                        ' Sonst Drehrichtung rechts; Wert verringern
        End If
    Return


    Man sieht, der Code ist ziemlich primitiv aber er funktioniert! Die Anschlusspins kann man natürlich beliebig ändern, bis auf den Interrupteingang, der entweder an INT0 oder INT1 liegen muss. Wenn Du während der Drehung des Drehgebers eine Taste abfragen willst (Wertänderung nur bei gedrückter Taste) geht das auch relativ simpel durch eine zusätzliche IF Abfrage innerhalb der INterruptroutine. Nur zu lang sollte die Abfrage nicht sein, sonst kommt der Prozessor ansonsten zu nix mehr!



    Das Gleiche funktioniert auch mehrmals hintereinander für mehrere Tasten. Ich arbeite dabei grundsätzlich mit aktivierten Pullups und Tastenbetätigung gegen Masse.


    Sö, das soll erstmal reichen. Die Routinen haben aber (bisher noch, soweit bin ich noch nicht) einen Nachteil: Der Wert wird nur alle zwei Rasten des Drehgebers erhöht oder verringert, aber daran arbeite ich gerade ;)


    EDIT: Hab ich vergessen: Wichtig ist, den Drehgeber mit 2x etwa 100nF gegen Masse zu entprellen, sonst kommt gar nix sinnvolles dabei raus!

    73 de Stefan DK6TM

    Einmal editiert, zuletzt von DK6TM ()

  • Zitat

    Original von DO7SKE
    Hallo Peter,


    welches Projekt? :)


    na, die Steuerung des Multiband/Multimode Transceivers, der aus dem Monobander entstehen wird 8)

    Zitat

    Die Routinen haben aber (bisher noch, soweit bin ich noch nicht) einen Nachteil: Der Wert wird nur alle zwei Rasten des Drehgebers erhöht oder verringert, aber daran arbeite ich gerade ;)


    EDIT: Hab ich vergessen: Wichtig ist, den Drehgeber mit 2x etwa 100nF gegen Masse zu entprellen, sonst kommt gar nix sinnvolles dabei raus!


    Und wenn du den Interrupt statt mit "Falling" mit "Change" abfragst??


    FALLING to generate an interrupt on the falling edge.


    RISING to generate an interrupt on the rising edge.


    CHANGE to generate an interrupt on the change of the edge.

    73/2 de Peter, DL2FI
    Proud member of Second Class Operators Club SOC and Flying Pig Zapper #OOO (Certificated Kit Destroyer)

  • Hallo Peter,


    auf die Idee bin ich auch schon gekommen, aber dann kann ich keine Drehrichtung mehr feststellen, weil die Flanke nicht mehr eindeutig ist (siehe Zeitdiagramm des Drehgebers).


    Aber ich glaube, ich habe (bzw. jemand aus dem Roboternetz hat) eine Lösung gefunden. Wenn ich das ausprobiert habe, poste ich den Code dazu :)

    73 de Stefan DK6TM

  • Zitat

    Original von DL2FI


    na, die Steuerung des Multiband/Multimode Transceivers, der aus dem Monobander entstehen wird 8)


    Super, wenn Du da Unterstützung brauchst, mach ich mit :) !


    Ich habe jetzt endlich den Drahtverhau im Speaky halbwegs unter Kontrolle, das heißt, ich kann wohl nach den abschließenden Tests und dem Abgleich die ersten QSOs damit fahren 8)


    Aber der Monobander und der daraus entstehende Multiband/Multimode interessiert mich brennend!

    73 de Stefan DK6TM

  • So, ich habe noch ein wenig experimentiert und herausgefunden, wie man den Wert bei jeder Drehgeber-Rastung weiterzählen lässt. Die erste Version war mit zwei Interrupts, was aber Verschwendung wäre. Die zweite Version fragt statt dessen den Status des Interrupt-Pins ab und unterscheidet dadurch die Drehrichtung. Der Interrupt-Eingang selbst kann damit auf "change" konfiguriert werden. :)



    Hier die Codeschnipsel:



    Der Aufruf des Interrupts mit change-Konfiguration

    Code
    Enable Interrupts
      Config Int0 = Change
      Enable Int0
    
    
    
    On Int0 Prog


    Die Interruptroutine:



    So, Problem erstmal gelöst, auch wenn das bei der Abfrage zur Zeit etwas mehr Aufwand bedeutet, aber den nehme ich in Kauf :)

    73 de Stefan DK6TM

  • Stefan,
    ich glaube das ist die gleiche Methode, die wir auch im Spatz anwenden. Schau mal:


    In der Initialisierung:


    LDI Temp1,0x02 ; Int0 auf fallende Flanke 02
    SBIS PIND,2 ; ENC-B = 1 ?
    INC Temp1 ; Int0 auf steigende Flanke 03
    OUT MCUCR,Temp1


    dann die Routine INT0:


    ; Hardware-Interrupt 0 Encoder


    Int0: IN Ireg1,MCUCR
    SBRS Ireg1,0 ; Int auf steigende Flanke?
    RJMP IntS3 ; nein ==> IntS3
    ANDI Ireg1,0xFE
    OUT MCUCR,Ireg1 ; Int0 auf fallende Flanke setzen
    SBIC PIND,1
    RJMP IntS2 ; Enc A = 1 ==> IntS2
    IntS1: ORI Status,anticlockwise
    RETI
    IntS2: ORI Status,clockwise
    RETI
    IntS3: ORI Ireg1,0x01
    OUT MCUCR,Ireg1 ; Int0 auf steigende Flanke setzen
    SBIS PIND,1
    RJMP IntS2 ; Enc A = 0
    RJMP IntS1 ; Enc A = 1

    73/2 de Peter, DL2FI
    Proud member of Second Class Operators Club SOC and Flying Pig Zapper #OOO (Certificated Kit Destroyer)

  • Hallo Peter,


    ja, das ist im Prinzip die gleiche Methode, wobei in dem Assembler-Code die Richtungsunsterscheidung nicht durch die Statusabfrage des Interrupt-Pins sondern durch Umschalten der Interruptflanke passiert. Sollte aber beides funktionieren. :)


    Willst Du denn den Controller komplett in Assembler programmieren, oder Codefragmente wie die Drehgeber abfrage in den Bascom-Code einstricken? Die Integration von Assembler lässt sich in Bascom auch schön als State-Machine machen.

    73 de Stefan DK6TM

  • Zitat

    Original von DO7SKE
    Hallo Peter,


    ja, das ist im Prinzip die gleiche Methode, wobei in dem Assembler-Code die Richtungsunsterscheidung nicht durch die Statusabfrage des Interrupt-Pins sondern durch Umschalten der Interruptflanke passiert. Sollte aber beides funktionieren. :)


    Willst Du denn den Controller komplett in Assembler programmieren, oder Codefragmente wie die Drehgeber abfrage in den Bascom-Code einstricken? Die Integration von Assembler lässt sich in Bascom auch schön als State-Machine machen.


    Speicherplatz ist ja bei den Atmels nicht mehr das Problem, so dass ich den größten Teil in Bascom schreiben will. Letztlich habe ich sowieso vor das ganze etwas zu entflechten indem ich mehr als einen Proz benutzenwill.
    Beispiel für die Grundidee:
    Hauptprozessor übernimmt die Kontrolle, bedient Drehgeber, Tasten und Display.
    Nebenprozessor zählt die Frequenz
    Hauptproz fragt nach Aktivität des Drehgebers aktuelle QRG vom ZählerProz ab und stellt sie ins Display.
    usw.

    73/2 de Peter, DL2FI
    Proud member of Second Class Operators Club SOC and Flying Pig Zapper #OOO (Certificated Kit Destroyer)

  • So, nachdem ich dann endlich den Drehgeber richti angeschlossen hatte und auch die beiden 100nF zum Entprellen eingabaut habe funktioniert die drehgeber Abfrage nun ausgezeichnet. Meine drei LEDs blinken lustig vor sich hin, sobald der Drehgeber betätigt wird zeigt das Display die Drehrichtung an ..... und sogar richtig :-))


    $regfile = "m8def.dat"
    $crystal = 3686400
    Declare Sub Titel
    Dim Farbe As String * 10



    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
    Config Lcd = 16 * 2
    'Config Portd = Output
    Ddrd = &B11110000
    Portd = &B00001111
    Ddrb = &B00000011
    Portb = &B00100000
    Config Portc = Output
    Enable Int0
    Config Int0 = Change
    On Int0 Intprog
    Enable Interrupts


    Do
    Waitms 500
    Cls


    Gosub Titel


    Farbe = "rot"
    Portc.0 = 1
    Portc.1 = 0
    Portc.2 = 0
    Gosub Titel
    Waitms 1000



    Farbe = "gelb"
    Portc.0 = 0
    Portc.1 = 1
    Portc.2 = 0
    Gosub Titel
    Waitms 1000


    Farbe = "gruen"
    Portc.0 = 0
    Portc.1 = 0
    Portc.2 = 1
    Gosub Titel
    Waitms 1000



    Loop
    Sub Titel
    Cls
    Upperline
    Lcd "DL2FI"
    Lowerline
    Lcd "LED " ; Farbe
    End Sub
    Intprog:
    Cls
    If Pind.2 = 0 Then ' das ist der Interrupt-Pin (INT0)
    If Pinb.5 = 0 Then ' und dies ist der zweite Drehgberausgang wie gehabt
    Lcd "Auf eins"
    Waitms 1000
    Cls
    Else
    Lcd "Ab eins"
    Waitms 1000
    Cls
    End If
    End If
    If Pind.2 = 1 Then ' hier wieder INT0, aber diesmal mit verändertem Vorzeichen (high)
    If Pinb.5 = 1 Then ' und die Abfrage des zweiten Drehgeberausgangs (ebenfalls invertiert!)
    Lcd "Auf zwei"
    Waitms 1000
    Cls ' und die Wertevergabe, genauso wie oben
    Else
    Lcd "Ab zwei"
    Waitms 1000
    Cls
    End If
    End If


    Return



    End

    73/2 de Peter, DL2FI
    Proud member of Second Class Operators Club SOC and Flying Pig Zapper #OOO (Certificated Kit Destroyer)

  • Hallo Peter,


    die Idee mehrere Controller zu benutzen ist gar nicht verkehrt, vor allem, weil man die mittels I^2C recht einfach vernetzen kann.


    Du kannst übrigens mittels locate Befehl den Controller anweisen, Text auf dem Display an definierten Positionen darzustellen.


    Beispiel:


    lcd "test" ' erscheint oben im Display ganz links


    locate 2 , 1 ' erscheint links in der zweiten Zeile.


    locate 2 , 6 ' erscheint an der 6. Position der zweiten Zeile.


    Damit lassen sich auch übersichtliche Displayeinteilungen machen.


    Aber mal eine andere Frage, ich tu mich im Moment noch ein bisschen schwer damit, die Vorgänge in einem DDS-IC und dessen Ansteuerung zu verstehen. Auf Dauer möchte ich den AT90XXX im Speaky gegen einen mega32 oder mega128 ersetzen, aber der muss halt auch die DDS ansteuern. Keine Ahnung wie das vonstatten geht, und bevor ich die DDS grille 8) :D Jemand eine Idee dazu?

    73 de Stefan DK6TM

  • Zitat

    Original von DO7SKE
    Hallo Peter,



    Aber mal eine andere Frage, ich tu mich im Moment noch ein bisschen schwer damit, die Vorgänge in einem DDS-IC und dessen Ansteuerung zu verstehen. Auf Dauer möchte ich den AT90XXX im Speaky gegen einen mega32 oder mega128 ersetzen, aber der muss halt auch die DDS ansteuern. Keine Ahnung wie das vonstatten geht, und bevor ich die DDS grille 8) :D Jemand eine Idee dazu?



    8) :] :P


    Merkst du was??
    Das eigentliche Ziel ist die Steuerung für den zukünftigen Multiband / Multimode TXVR.
    Zwischenprodukt soll eine neue Frontplatte mit integrierter Steuerlogik für Speaky werden, da ich den 90S2313 nicht mehr bekomme, die Umsetzung auf Atiny zwar einfacher wäre aber mir die Idee viel besser gefällt, dem Speaky ein komplett neues Steuerteil zu verpassen. Als Übungsobjekt sozusagen.


    Seit knapp einer Stunde rechne ich hier mit dem DDS Getöse rum. Ich habe ja als Vorlage das halbwegs dokumentierte Assembler file und eine Exel- Rechenanleitung dazu. Weit bin ich aber noch nicht gekommen.


    Die Zerlegung in mehrere Pozessoren hat übrigens noch einen Vorteil: Man kann das ganze Projekt viel besser aufteilen, auch unter verschiedene Leute ;)
    Ich schick dir mal den Assembler Code und die Excell Anleitung, da kannst du dann ja mit forschen.

    73/2 de Peter, DL2FI
    Proud member of Second Class Operators Club SOC and Flying Pig Zapper #OOO (Certificated Kit Destroyer)

  • Hallo Peter,


    dann sollte man aber auch die Bandumschaltung elektronisch (also über Relais oder so) regeln. Dieser Drehschalter treibt mich auch in den Wahnsinn :D .


    Ist ja prima, dass wir sozusagen die gleiche Idee haben, weil sich sowas mit mehreren Leuten immer einfacher realisieren lässt, als wenn man da alleine rumbasteln muss. Beim Speaky würde ich die DDS-Ansteuerung, die Bandumschaltung und das Display komplett trennen. Die einzelnen Atmels könnte man per I2C vernetzen und dadurch auch solche Sachen wie eine Bandumschaltung und eine QRG Anzeige ohne direkte Frequenzmessung realisieren (im Prinzip stellt ja die DDS alle Informationen bereit und wenn man dann noch weiß, welches Band gerade aktiv ist...).


    Der Bascom-Code für den DDS scheint ja gar nicht sooo komplex zu sein, wie ich dachte. Da werd ich mir morgen mal ein paar Gedanken zu machen und evtl. ein kleines Zusatzboard für den Speaky löten (eigentlich sollte ich erstmal den Speaky in Betrieb nehmen). Im Prinzip scheint ja der Knackpunkt in der Berechnung der Frequenz und der Umsetzung in das 16Bit Steuerwort zu sein. Aber das kriegen wir sicherlich hin :)

    73 de Stefan DK6TM

  • Zitat

    Original von DL2FI
    So, nachdem ich dann endlich den Drehgeber richti angeschlossen hatte und auch die beiden 100nF zum Entprellen eingabaut habe funktioniert die drehgeber Abfrage nun ausgezeichnet. Meine drei LEDs blinken lustig vor sich hin, sobald der Drehgeber betätigt wird zeigt das Display die Drehrichtung an ..... und sogar richtig :-))


    So, nun blinken keine Lampen mehr, sondern der externe Zähler zeigt eine Frequenz an, die ich sogar mit dem Drehgeber verändern kann - welch Fortschritt.
    Nun muss ich nur noch verstehen, wie man eine Dezimale Frequenzangabe in MSB und LSB umrechnet, damit ich definierte Schritte vorgeben kann.


    Die Ansteuer Routine habe ich übrigens hier im Forum gefunden - sieht aber stark nach dem prgm aus Greifswald für den Funktionsgenerator aus.


    $regfile = "m8def.dat"
    $crystal = 3686400
    $hwstack = 32 'Hardware Stack
    $swstack = 8 'Software Stack
    $framesize = 20 'Framsize


    Dim Send As Word
    Dim Addqrg As Word '16Bit Variable die zum DDS gesendet wird
    '
    '
    Fsync Alias Portb.2 'AD9835 FSYNC Ausgang(16)
    Sdata Alias Portb.3 'AD9835 SDATA Ausgang(1
    Sclk Alias Portb.4 'AD9835 SCLK Ausgang(19)
    '
    '
    '
    Dim Farbe As String * 10
    '
    Declare Sub Titel
    Declare Sub _ser_output
    Addqrg = &B0100100011111111
    '--init program---------------------------------------------------------------------------------------------------
    '



    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.1 , Rs = Portb.0
    Config Lcd = 16 * 2
    'Config Portd = Output
    Ddrd = &B11110000
    Portd = &B00001111
    Ddrb = &B00011111
    Portb = &B00100000
    'Config Portc = Output
    Enable Int0
    Config Int0 = Change
    On Int0 Intprog
    Enable Interrupts


    Waitms 500
    Cls


    'Initialisierung AD9834 mit 7,030MHz als Startwert
    '


    Send = &B0010000000000000 'Control word
    Gosub Ser_output
    Send = &B0110010111001001 'LSB 14Bits in freq1 10010111001001
    Gosub Ser_output
    Send = &B0100100011111111 'MSB 14Bits in freq1 00100011111111


    Gosub Ser_output
    Addqrg = Send



    Do
    Send = &B0010000000000000 'Control word
    Gosub Ser_output
    Send = &B0110010111001001 'LSB 14Bits in freq1 10010111001001
    Gosub Ser_output
    Send = &B0100100011111111
    Send = Addqrg
    Gosub Ser_output 'MSB 14Bits in freq1 00100011111111




    Loop
    Sub Titel
    Cls
    Upperline
    Lcd "DL2FI"
    Lowerline
    Lcd "LED " ; Farbe
    End Sub
    Intprog:
    Cls
    If Pind.2 = 0 Then ' das ist der Interrupt-Pin (INT0)
    If Pinb.5 = 0 Then ' und dies ist der zweite Drehgberausgang wie gehabt
    Addqrg = Addqrg + 10


    Else
    Addqrg = Addqrg - 10


    End If
    End If
    If Pind.2 = 1 Then ' hier wieder INT0, aber diesmal mit verändertem Vorzeichen (high)
    If Pinb.5 = 1 Then ' und die Abfrage des zweiten Drehgeberausgangs (ebenfalls invertiert!)
    Addqrg = Addqrg + 10 ' und die Wertevergabe, genauso wie oben
    Else
    Addqrg = Addqrg - 10
    End If
    End If


    Return
    'Serielle Schnittstelle zum AD9835
    Ser_output:
    Reset Fsync 'AD9834 bereit
    Shiftout Sdata , Sclk , Send , 0 '16Bit senden, MSB zuerst, Takt fallende Flanke
    Set Fsync 'AD9834 fertig
    Return



    End

    73/2 de Peter, DL2FI
    Proud member of Second Class Operators Club SOC and Flying Pig Zapper #OOO (Certificated Kit Destroyer)