Atmega1284 und beide UART

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Franz schrieb:

      deine ISR wird nicht genau das machen, was du dir erwartest.

      Franz schrieb:

      Daher die Empfehlung, das UDR Register einmal am Anfang der ISR in eine eigene Variable zu lesen und dann im Rest der ISR diese zu verwenden.
      Meinst Du so?
      Temp = Udr
      Incr N1
      S1 = S1 + Chr(temp)

      Jetzt muss ich aber auch auf 10 statt 13 warten If Temp = 10 Then weil ja 10 am Ende ist.
      Muss ich Temp am Ende der ISR wieder löschen?

      Quellcode

      1. Onrxd: 'com1, sim
      2. Temp = Udr
      3. Incr N1
      4. S1 = S1 + Chr(temp)
      5. If Temp = $3e Then Flag_text_senden = 1
      6. If Temp = 10 Then
      7. If N1 < 3 Then
      8. N1 = 0 : S1 = ""
      9. Else
      10. Sim800_daten = S1
      11. Cr_sim_da = 1
      12. N1 = 0 : S1 = ""
      13. End If
      14. End If
      15. If N1 > 220 Then Decr N1
      16. Return
      Alles anzeigen
    • Ja, mit Temp ist das so ok.
      Ich nehme an, du willst 10 und 13 und evtl. auch $3e nicht in Sim800_daten haben.
      Dann speichere sie doch einfach nicht dorthin ab. Das ist ja einer Vorteile, die bei einer eigenen ISR hast.
      Die Zeile 16 erschließt sich mir immer noch nicht. Wie gesagt, dein String wird immer weiter wachsen, wenn kein LineFeet kommt. Das musst du verhindern, nicht dass N1 nicht größer als 220 wird.
    • 10 soll das String ende sein. Wenn das eintrifft soll der String in der Do-LOOP verarbeitet werden.
      Wenn $3e kommt soll ein Text gesendet werden.

      Franz schrieb:

      Die Zeile 16 erschließt sich mir immer noch nicht. Wie gesagt, dein String wird immer weiter wachsen, wenn kein LineFeet kommt. Das musst du verhindern, nicht dass N1 nicht größer als 220 wird.
      Zeile 16 soll verhindern dass N1>220 wird.
    • Franz schrieb:

      Das musst du verhindern, nicht dass N1 nicht größer als 220 wird.
      Oh Mann, hatte Tomaten auf den Augen. Natürlich muss ich mich nicht um Nx kümmern sondern um Sx.

      Irgendwie hänge ich wieder fest. Hab alles raus geschmissen bis aufs Nötigste.

      Quellcode

      1. Onrxd1:
      2. 'LF=10 CR=13
      3. Temp_pc = Udr
      4. Incr N2
      5. Led_3 = 1
      6. If Temp_pc = 10 Then
      7. Led_2 = 1
      8. Pc_daten = S2
      9. Cr_pc_da = 1
      10. N2 = 0 : S2 = ""
      11. Else
      12. S2 = S2 + Chr(temp_pc)
      13. End If
      14. If N2 >= 220 Then
      15. S2 = "" : N2 = 0
      16. Led_4 = 1
      17. End If
      18. Return
      Alles anzeigen

      Allerdings findet die Routine weder CHR(10) noch CHR(13). Mitgesendet wird jedoch beides (Im Terminal so eingestellt). Kann man auch so mit einem Sniffer sehen.

      An LED_2 sehe ich dass die ISR angesprungen wird. An LED_3 dass LF empfangen wird und an LED_3 dass es zum Überlauf kommt.

      Jetzt passiert aber folgendes: Sobald ein Zeichen empfangen wird geht LED_2 und LED_4 an und nicht mehr aus, trotz dem zurücksetzen in dem Timer Interrupt. Die Schnittstelle von meinem PC sendet jedoch definitiv nur ein Zeichen gefolgt von CRLF.

      Wieso erkennt meine Routine CR oder LF nicht?
      LED_2 und LED_4 gehen nie aus. Das bedeutet für mich dass die Schnittstelle vom PC dauernd weiter sendet aber laut Sniffer ist das definitiv nicht der Fall.

      Beispiele im Internet und die Hilfe von Bascom machen doch auch nichts anderes.

      Quellcode

      1. $regfile = "m1284pdef.dat" ' eingesetzter Mikrocontroller
      2. $crystal = 18432000 ' eingestellte Taktfrequenz
      3. $hwstack = 100
      4. $swstack = 80
      5. $framesize = 700
      6. $baud = 9600
      7. $baud1 = 38400
      8. 'Timer 1
      9. 'OCR0 = f_cpu / (1024 * f_timer)
      10. Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
      11. Ocr1a = 1800 - 1 '18000 - 1
      12. Enable Oc1a
      13. On Urxc1 Onrxd1
      14. Enable Urxc1
      15. Const Pc = 2
      16. Open "COM2:" For Binary As #pc
      17. Enable Interrupts
      18. 'Ports out, JTAG Interface ausschalten
      19. Config Portc = Output 'gesamten Port c als Ausgabeport
      20. Led_1 Alias Portc.7
      21. Led_2 Alias Portc.6
      22. Led_3 Alias Portc.5
      23. Led_4 Alias Portc.4
      24. Switch_12v Alias Portc.3 : Switch_12v = 0 'geschaltete 12V
      25. Switch_5v Alias Portc.2 : Switch_5v = 0 'Geschaltete 5V
      26. Bt_enable Alias Portc.1 : Bt_enable = 0 'EN Pin HC-05
      27. Sim_reset Alias Portc.0 : Sim_reset = 0 'Resetpin SIM800
      28. 'ports in
      29. In_1 Alias Pina.4 : Config In_1 = Input 'eingang mit pullup Portb.1 = 1
      30. In_2 Alias Pina.5 : Config In_2 = Input
      31. In_3 Alias Pina.6 : Config In_3 = Input
      32. In_4 Alias Pina.7 : Config In_4 = Input
      33. '######################################### Variablen ############################
      34. 'serielle kommunikation
      35. Dim S2 As String * 220
      36. Dim Pc_daten As String * 220
      37. Dim N2 As Byte
      38. Dim Cr_pc_da As Byte
      39. Dim Temp_pc As Byte ' Variable für seriell (UDR)
      40. Dim Millisekunden_tick As Byte
      41. Led_1 = 1 : Led_2 = 0 : Led_3 = 0 : Waitms 100
      42. Led_1 = 0 : Led_2 = 1 : Led_3 = 0 : Waitms 100
      43. Led_1 = 0 : Led_2 = 0 : Led_3 = 1 : Waitms 100
      44. Led_1 = 0 : Led_2 = 0 : Led_3 = 0
      45. On Oc1a Timer_tick
      46. S2 = "" : N2 = 0
      47. Do
      48. If Cr_pc_da = 1 Then
      49. Print#pc , Pc_daten
      50. Pc_daten = ""
      51. Cr_pc_da = 0
      52. End If
      53. Loop
      54. End
      55. Onrxd1:
      56. 'LF=10 CR=13
      57. Temp_pc = Udr
      58. Incr N2
      59. Led_2 = 1
      60. If Temp_pc = 10 Then
      61. Led_3 = 1
      62. Pc_daten = S2
      63. Cr_pc_da = 1
      64. N2 = 0 : S2 = ""
      65. Else
      66. S2 = S2 + Chr(temp_pc)
      67. End If
      68. If N2 >= 220 Then
      69. S2 = "" : N2 = 0
      70. Led_4 = 1
      71. End If
      72. Return
      73. 'Timer
      74. Timer_tick:
      75. Incr Millisekunden_tick
      76. If Millisekunden_tick >= 10 Then
      77. Millisekunden_tick = 0
      78. Toggle Led_1
      79. Led_2 = 0 : Led_3 = 0 : Led_4 = 0
      80. End If
      81. Return
      Alles anzeigen
    • Michael schrieb:

      Du musst UDR1 statt UDR lesen.
      Aaaalter, wie bescheuert bin ich???

      Ich hab den Code stundenlang vor und rückwärts gelesen probiert umgestellt. Im Internet nachgeschaut. Pause gemacht und wieder alles von vorne... Oskar angeschlossen, Laptop raus geholt, USB Adapter getauscht. Und dann so was...

      Vielen Dank Michael. Ohne Dich hätte ich wohl noch Wochen gesucht..
    • Franz schrieb:

      Das andere Problem ist das Abspeichern in den String S1.

      Franz schrieb:

      Das Abspeichern kannst du durch Verwendung von Overlays sehr stark beschleunigen.
      Hab das jetzt so gelöst:

      Quellcode

      1. Dim Sim800_daten As String * 220 : Dim Sim800_ovly(221) As Byte At Sim800_daten Overlay
      2. Onrxd: 'com1, sim
      3. 'LF=10 CR=13
      4. Temp_udr = Udr
      5. If Temp_udr = 10 Then
      6. Sim800_ovly(n1 ) = 0
      7. Cr_sim_da = 1
      8. N1 = 0
      9. Else
      10. Sim800_ovly(n1) = Temp_udr
      11. End If
      12. If Temp_udr = $3e Then
      13. Flag_text_senden = 1
      14. N1 = 0
      15. End If
      16. If N1 >= 220 Then
      17. N1 = 0
      18. End If
      19. Incr N1
      20. Return
      Alles anzeigen
      Und arbeite mit Sim800_daten ganz normal weiter. Funktionieren tut es also denke ich dass es richtig ist.


      Franz schrieb:

      Nach
      S1_ovly(4) = 116 't
      S1_ovly(5) = 0 'String-Ende
      Ich gehe davon aus dass ich das Stringende (0) selbst setzen muss. Was passiert mit den Daten nach Stringende? Die stehen ja noch in Sim800_daten. Muss ich die löschen? Fallen die mir irgendwann mal auf die Füße?

      Gruß, Martin
    • Die Daten nach dem Stringende werden nicht genutzt und brauchen auch nicht gelöscht zu werden.
      Ein String="" mach nicht anderes als eine 0 an erster Stelle zu setzen.
      Bei dieser Empfangsroutine ist die 0 erst vorhanden wenn er fertig ist. Sollte er vorher betrachtet werden ist er ein Durcheinander von neuen Zeichen und alter Läge. Je nach Main kann es nötig sein bei jedem empfangenen Zeichen die Null anzuhängen.