ATTiny 25

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Hallo Zusammen
      Der Winzling ATTiny 25 bringt mich noch zur Verzeiflung

      Problem:

      Der Ausgang Jz_out soll in Abhängigkeit des Steuereingangs Tz durchgereicht werden
      Bei Tz =0 (Nacht) einfach 1:1 auf Durchzug
      Bei Tag mit Verzögerung einschalten und ohne Verzögerung ausschalten

      Das Ding macht einfach nicht das was ich will

      Wichtig: Ich bin nur Hobbyprogrammierer

      ******************************************************************


      Source Code

      1. '------------------------------------------------------------------
      2. ' Tiny25_1.bas
      3. ' 10.11.2022
      4. ' ATTiny25
      5. ' V 1.0
      6. ' Impulsunterdrückung und Einschaltverzögerung
      7. '------------------------------------------------------------------
      8. '
      9. '
      10. $regfile = "attiny25.dat"
      11. $Crystal=1000000 'intern 8,0 MHz / 8
      12. $hwstack = 32
      13. $swstack = 32
      14. $framesize = 40
      15. Config PinB.0 = input 'Jahreszeit Eingang
      16. Config PinB.2 = input 'Tageszeit Eingang
      17. Config PortB.1 = Output 'Jahreszeit Ausgang
      18. Config PortB.4 = Output 'Messausgang
      19. 'Test alias portb.4 ' nur für Test
      20. Tz alias PinB.2
      21. Jz_in alias PinB.0
      22. Jz_out alias PortB.1
      23. Tz=1 ' Pull up ein (nur für Test)
      24. Jz_in =1 ' Pull up ein (nur für Test)
      25. Enable Interrupts
      26. do
      27. select case Tz
      28. case 0: Jz_out = Jz_in 'Nacht 1:1 Übertragung
      29. case 1: goto M1 'Tag
      30. end select
      31. M1: 'Tag
      32. select case Jz_in
      33. case 0: Jz_out = 0
      34. case 1: goto M2
      35. end select
      36. M2: ' Verzögerung Anstieg
      37. Wait 2
      38. Jz_out = Jz_in
      39. loop
      40. end
      Display All
    • Hallo @Anton70

      Ich würde es so machen

      BASCOM Source Code

      1. $regfile = "attiny25.dat"
      2. $Crystal=1000000 'intern 8,0 MHz / 8
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 40
      6. Config PortB.0 = input 'Jahreszeit Eingang
      7. Config PortB.2 = input 'Tageszeit Eingang
      8. Config PortB.1 = Output 'Jahreszeit Ausgang
      9. Config PortB.4 = Output 'Messausgang
      10. Portb.0 = 1 ' Pullup
      11. Portb.2 = 1 ' Pullup
      12. ' Merker definieren
      13. Dim Tz as Byte
      14. Dim Jz_In as Byte
      15. Dim Jz_Out as Byte
      16. Enable Interrupts ' für was?
      17. Do
      18. ' Auf Merker umsetzen damit das Programm
      19. ' immer mit den gleichen Daten Arbeitet.
      20. Tz = PinB.2
      21. Jz_In = PinB.0
      22. Portb.1 = Jz_out
      23. If Tz =0 Then
      24. Jz_out = Jz_in 'Nacht 1:1 Übertragung
      25. Elseif Tz = 1 Then
      26. If Jz_In = 0 Then
      27. Jz_out = 0
      28. Elseif Jz_in = 1 Then
      29. Wait 2
      30. Jz_out = Jz_in
      31. End If
      32. End If
      33. Loop
      34. end
      Display All
      Ich habe mir das Goto total abgewöhnt.
      Dadurch das du alles in der Do-Loop Schleife hast kommt dein M2: immer zur Geldung.
      Und je nachdem wann die Signal wechseln kann das mal irgendwo in der Schleife passieren.
    • Anton70 wrote:

      Das Ding macht einfach nicht das was ich will
      Weil immer alles durchlaufen wird. z.B. Tz=0 in der ersten Case wird der Ausgang gesetzt und die Select Case verlassen. Aber Dann geht es mit M1 weiter obwohl das nicht gewünscht ist.
      Und zum Schluß rennt M2 auch noch
      Ein Möglichkeit wäre

      Source Code

      1. Do
      2. M0:
      3. select case Tz
      4. Case 0
      5. Jz_out = Jz_in 'Nacht 1:1 Übertragung
      6. Goto M0
      7. Case 1
      8. ...
      9. Case 0
      10. Jz_out = 0
      11. Goto M0
      12. case 1
      13. ....
      Display All
      Eine andere wäre das Loop...End nach der ersten End Select zu setzen und die goto in gosub zu ändern.
      M1: und M2: wären dann Subroutinen die mit Retun beendet werden müssen
      Das hat den Vorteil das sie nur laufen wenn sie aufgerufen werden (und nicht immer)
      Und sie können (wenn das Projekt größer wird) von verschiedenen Stellen im Code aufgerufen werden. Ihr Return sorgt dann dafür das es genau an der Stelle weiter geht von wo sie aufgerufen (gosub) wurden.
    • Ich hab auch noch einen:

      Um einen PullUp-Widerstand zu aktivieren, muss man das PORT-Register auf 1 setzen (und natürlich den I/O-Port als Input konfigurieren, aber das sind alle I/O-Ports beim Einschalten der Spannungsversorgung sowieso). Das PIN-Register dient einzig und alleine der Abfrage es anliegenden logischen Pegels.

      Statt
      1. Tz=1 ' Pull up ein (nur für Test)
      2. Jz_in =1 ' Pull up ein (nur für Test)
      solletst Du also lieber schreiben

      PORTB.0=1
      PORTB.2=1

      wenigstens wenn Du die PullUp-Widerstände brauchst.