- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Soft UART sendet, empfängt aber nicht

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von PicNick Beitrag anzeigen
    ...werd ich mir die diversen Soft-Uart Routinen disassemblieren und melde mich dann auf der Kampfstatt wieder *g*
    Alles klar.

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    So, im Nachhinein betrachtet ohnehin klar:
    Man muss/darf (wenn man INKEY() verwenden will) natürlich nur das speichern, was NICHT 0 ist. Als Endeerkennung einer Nachricht ist "0" wenig geeignet.
    Wenn man z.b <CR> als Nachricht-Ende nimmt ( was Bascom-PRINT freiwillig tut, wenn man ihn nicht hindert), müsste die Receive-Schleife lauten:
    Code:
        DO  
            inchar= inkey(#2)
            if inchar > 0
                  incr myidx
                  myarr(myidx) = inchar
            end if
        LOOP until  inchar = 27  
    
        myarr(myidx) = 0    ' ev. ein String-ende aus dem <CR> machen
    unter der Annahme, dass das Speichern nicht zu langsam ist. Müsst man ausrechnen, bis zu welcher baudrate es reicht.
    Sonst ist wohl eher "INPUT #" oder GET # geeignet


    Wen es interessiert, so sieht INKEY() von innen aus:
    Code:
    open comb.4:9600,8,n,1 
    
    L_0x00DE:   ' delay 1/2 bit --------------------------
     PUSH r24
     PUSH r25
     LDI r24,0x08
     LDI r25,0x00
    L_0x00E6:
     SBIW r24,0x0001
     BRNE L_0x00E6
     POP r25
     POP r24
     RET
    
    ' inkey (#1)  ---------------------------------
    L_0x00F0:
     SBIS 0x0016,4      ' check PortB.4
     RJMP L_0x00F8      ' start
     CLR r24            ' return 0
     RET
    L_0x00F8:
     LDI r18,0x09       ' counter = 9 (8 + 1 )
    L_0x00FA:           ' loop until PortB.4 = 0
     SBIC 0x0016,4      ' 
     RJMP L_0x00FA  
     RCALL L_0x00DE     ' delay 1/2 bit
    L_0x0100:
     RCALL L_0x00DE     ' delay 1/2 bit
     RCALL L_0x00DE     ' delay 1/2 bit
    CLC                ' clear carry
     SBIC 0x0016,4      ' PortB.4 = ?
     SEC                ' = 1---> set Carry
     DEC r18            ' decr counter
     BREQ L_0x0114      ' counter= 0 --> exit
     ROR r24            ' shift carry into r24:r25
     ROR r25
     RJMP L_0x0100      ' next bit
    L_0x0114:
     RET                ' R24 = inbyte  (that's it)
    Der Unterschied von Waitkey ist minimal
    Code:
    ' waitkey (#1)  ---------------------------------
    L_0x00F0:
     SBIS 0x0016,4 ' wait PortB.4 = 0
     RJMP L_0x00F6 ' start 
     RJMP L_0x00F0 ' cont'd wait    Das ist der einzige Unterschied 
    
    
    Geändert von PicNick (02.01.2012 um 16:54 Uhr)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von PicNick Beitrag anzeigen
    unter der Annahme, dass das Speichern nicht zu langsam ist. Müsst man ausrechnen, bis zu welcher baudrate es reicht.
    9600 Baud = 9600 Bit/Sek, bei 16 MHz sind dann 1667 Takte pro Bit, da kann er viel speichern. Auch bei 76800 Baud, welche bei 16 MHz nur 0.2% Fehler hätten, wären's noch 208 Takte, sollte auch noch locker reichen. Voraussetzung ist, dass keine Interrupts unterbrechen.
    Code:
    ' inkey (#1)  ---------------------------------
    L_0x00F0:
     SBIS 0x0016,4      ' check PortB.4
     RJMP L_0x00F8
     CLR r24            ' return 0
     RET
    Der Unterschied von Waitkey ist minimal
    Code:
    ' waitkey (#1)  ---------------------------------
    L_0x00F0:
     SBIS 0x0016,4 ' wait PortB.4 = 0
     RJMP L_0x00F6 ' start 
     RJMP L_0x00F0 ' cont'd wait
    Das ist der einzige Unterschied

    Aber der Entscheidende.

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    "der kleine Unterschied", in der Tat.
    bei INKEY() kann man leicht eine Timeout-kontrolle einbauen, dafür muss man sich aber über die Fehlerbehandlung in so einem Fall Gedanken machen.
    Bei WAITKEY() hilft ohnehin nur der reset-knopf oder der Watchdog.

    pS: mit so Sachen wie Frame-control etc. hat sich Mark offenbar nicht auseinandergesetzt.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Softuart ist nicht gepuffert. Ein "wait 3" in der Hauptschleife ist also fehl am Platze. Wenn ich Softuart nutze, dann packe ich die Routine in ein Sub und rufe dieses öfter mal aus der Hauptschleife auf. So funktioniert zuverlässig meine per Softuart angebundene Fernbedienung an meinem Radio. Einen wait-Befehl gibt es bei mir so gut wie gar nicht nach Beginn der Hauptschleife. Wenn, dann mal im Millisekundenbereich (waitms / waitus). Alles Andere wird per selbstgestrickter "Tickcount" API aufgerufen. Z.B. DS1820 sagen, er solle die Temperatur aufbereiten, den ticktemp auf 0 und wenn er 100 erreicht hat (mein Tickcount läuft im 10 ms Takt) wird die Temperatur abgeholt. Größere Projekte haben meist noch eine Uhr mit "an Board". Da kann man schön die Sekunden vergleichen.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. RN-Funk sendet, empfängt aber nicht
    Von DEAF BOY im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 28.12.2011, 17:59
  2. Asuro sendet (und empfängt?) nichts
    Von Hannibal1412 im Forum Asuro
    Antworten: 13
    Letzter Beitrag: 06.02.2010, 14:28
  3. Antworten: 2
    Letzter Beitrag: 04.08.2008, 04:31
  4. 18f1320 USART sendet aber empfängt nicht
    Von stalky13 im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 20.06.2007, 20:06
  5. UART ermöglicht Senden, aber kann nicht Empfangen
    Von batti112 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 18.09.2004, 16:05

Stichworte

Berechtigungen

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

LiFePO4 Speicher Test