-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Variable am Port ausgeben

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von HM
    Registriert seit
    01.12.2003
    Beiträge
    161

    Variable am Port ausgeben

    Anzeige

    Hallo Wissende,
    ich möchte eine Variable am Port ausgeben. Leider wird im Simulator nur bis 5 hochgezählt aber an dem PortB tut sich nichts, woran kann das liegen.
    Wie funktioniert sowas eigentlich prinzipiell?
    Könnt Ihr mir bitte helfen, wär sehr nett?
    Vielen Dank für Antworten. MfG

    Hier ist das Programm dazu:

    HTML-Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 32
    $framesize = 60
    
    Ddrb = &B0001_1111
    Portb = &B0000_0000
    
    Dim A As Byte
    
    Portb = A
    
    Do
    
    For A = 0 To 4
    Waitms 10
    Next A
    
    Waitms 200
    
    Loop
    
    End

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Du hast auch zwei Fehler in deinem Programm.
    Mit diesem Befehl:

    Portb = A

    schreibst du den Inhalt der Variable A in das Register von PortB. Dies machst du in deinem Programm vor der eigentlichen Schleife.
    Wenn du das regelmässig ändern willst muss das so aussehen:

    Do

    For A = 0 To 4
    Waitms 10
    Next A

    Waitms 200

    Loop

    End

    Wenn du das vor dem "Do" machst wird das nur 1x beim starten des Programmes gemacht. Desweiteren wird im Simulator nur bis 5x gezählt, weil die "For"-Schleife nur von 0-4 geht. Wenn du höher zählen willst musst du:

    For A = 0 To 100

    oder sowas schreiben.
    Das fertige Programm sieht dann etwa so aus:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 32
    $framesize = 60
    
    Ddrb = &B0001_1111
    Portb = &B0000_0000
    
    Dim A As Byte
    
    Do
    
    For A = 0 To 255
    Waitms 10
    Next A
    Portb = A
    
    Waitms 200
    
    Loop
    
    End
    Nun wird alle 200ms etwa die Variable um 1 erhöht und das wird dann am PortB ausgegeben. Mit "For A = 0 To 255" legst du eine "For"-Schleife fest die die Variable A von 0-255 zählt. Dann mit "Next A" wird die Variable dann um den festgelegten Schritt erhöht. Da du in der "For"-Schleife keinen Schritt festgelegt hast wird die Variable bei "Next A" um 1 erhöht. Mit "PortB = A" schreibst du die Variable in das PortB-Register.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Na ja, auch Deine Version hat noch einen Schönheitsfehler, Kampi:

    Zwar wird A von 0 bis 255 hochgezählt, aber der Befehl PORTB = A kommt erst danach! Und so wird auch immer nur 255 am PORTA ausgegeben.

    @ HM:

    Wenn Du alle 200 Milisekunden den PortB um einen Zähler erhöhen möchtest, würde ich das so machen:

    Code:
    ...
    ...
    
    Dim A as Byte
    
    Do
    For A = 0 to 15  (limitiert das ganze auf die "unteren" 4 Bits von PORTB)
    PORTB = A
    waitms200
    Next A
    Loop

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Stimmt. Sorry hab leider nur geguckt ob es Kompilierungsfehler gibt und nicht ob der Code funktioniert

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Zitat Zitat von Kampi Beitrag anzeigen

    Wenn du das vor dem "Do" machst wird das nur 1x beim starten des Programmes gemacht. Desweiteren wird im Simulator nur bis 5x gezählt, weil die "For"-Schleife nur von 0-4 geht. Wenn du höher zählen willst musst du:

    For A = 0 To 100

    oder sowas schreiben.
    Das fertige Programm sieht dann etwa so aus:

    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 40
    $swstack = 32
    $framesize = 60
    
    Ddrb = &B0001_1111
    Portb = &B0000_0000
    
    Dim A As Byte
    
    Do
    
    For A = 0 To 255
    Waitms 10
    Next A
    Portb = A
    
    Waitms 200
    
    Loop
    
    End
    Jetzt wird nur 1 x am Ende etwas passieren Portb = A gehört VOR dem Next A

    For A = 0 To 255
    Waitms 10
    Portb = A
    Next A

    Gruß Richard

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Ja das hat sauerbruch auch gemeint

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied Avatar von HM
    Registriert seit
    01.12.2003
    Beiträge
    161
    Hallo Kampi, Sauerbruch und Richard,
    ich bin wieder zu Hause, vielen Dank für eure kompetenten Antworten, super.
    Also das mit dem "PortB" hatte ich auch schon in der "Do Loop" drinstehen, nur nich vor dem "Next". So wie Ihr das geschrieben habt funktioniert es, die Ports schalten sich ein und aus.
    Ich wollte PortB.0 bis PortB.4 der Reihe nach ein und ausschalten (H/L) (immer nur ein Port), jetzt habe ich gemerkt, das die Ports beim Weiterschalten die vorhergehenden nachziehen (jedenfalls im Simulator), das soll aber nicht so sein.
    Was kann man da machen?
    Vielen Dank. MfG

  8. #8
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    Wenn du nur PortB.0-4 anschalten willst hat du nur 5 Bit also musst du 5x zählen aber nicht mit +1 sondern mit +2. Und nach dem
    PortB = A
    Waitms 200
    schreibst du dann
    PortB = 0
    Next A
    So sollte das eigentlich funktionieren. Kann es leider im Moment nicht prüfen, weil mir der PC fehlt

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied Avatar von HM
    Registriert seit
    01.12.2003
    Beiträge
    161
    Hallo Kampi,danke für Deine Antwort.Bei mir im Zimmer sind 28Grad Wärme, da muß ich morgen weitermachen. Ich melde mich dann.MfG

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Wenn du nur PortB.0-4 anschalten willst hat du nur 5 Bit also musst du 5x zählen aber nicht mit +1 sondern mit +2.
    Auch das stimmt nicht ganz - denn dann würde A ja die Werte 2,4,6,8 und 10 annehmen. Und wenn diese Werte auf den PORTB ausgegeben werden, entsteht zwar ein interessantes Muster, aber kein "durchlaufendes" Bit.

    Wenn ich Dich richtig verstanden habe, HM, möchtest Du so ´ne Art Lauflicht realisieren. Also die folgenden Bytes ausgeben:

    00000001
    00000010
    00000100
    00001000
    00010000

    Richtig? Dann mach´ doch mal den Windows-Rechner auf und wandle diese Binärzahlen in Dezimalzahlen um. Herauskommen wird 1,2,4,8 und 16. Heißt also im Klartext, dass Du mit A=1 anfängst, dann alle 200 ms den Befehl A=A*2 machst, und A wieder auf 1 setzt, nachdem es 16 gewesen ist. In Code also etwa so:

    Code:
    ...
    ...
    Dim A as byte
    A=1
    
    Do
    PORTB = A
    Waitms200
    If A=16 then A=1 else A=A*2
    Loop
    Und das müsste auch bei > 28 Grad funktionieren

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Variable auf LCD ausgeben
    Von Haveaniceday im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 20.07.2017, 19:57
  2. HD44780U LCD library und inhalt einer variable ausgeben?
    Von donald_dack im Forum C - Programmierung (GCC u.a.)
    Antworten: 16
    Letzter Beitrag: 05.12.2009, 20:23
  3. Variable in LCD Ausgeben
    Von guthardt im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 29.12.2008, 22:18
  4. float Variable mit printf ausgeben(UART)
    Von Kera im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 02.02.2006, 12:45
  5. Int Variable auf LCD ausgeben
    Von Jan.HH im Forum C - Programmierung (GCC u.a.)
    Antworten: 14
    Letzter Beitrag: 16.11.2005, 22:44

Berechtigungen

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