Microcontroller-Tutorial für Anfänger - Teil I - Grundlagen

  • Dann teste mal Code wie...
    [code:1]Dim A as Byte
    do
    PortB = Rnd(255)
    if ___rseed < 1500 then
    ___rseed = ___rseed + 2
    Else ___rseed = 0
    End If
    Waitms 100
    loop[/code:1]


    Der Trick liegt darin, möglichst zufällig zu werden - denn die RND() Funktion ist NICHT sehr zufällig ;)
    Aber mit __rseed kann man den sogenannten Random-Seed ändern - dann wirds auch wieder zufälliger.


    Der jeweilige Port wird dann einfach nach Zufall gesetzt und fertig.


    Stefan Z

  • Der code geht irgendwie nicht, er bringt mir 4 Fehler.




    [code:1]$regfile = "2313def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40



    Config Portb = Output
    Config Portd = Output
    Dim Warten As Byte
    Dim A As Byte



    Do
    Portd = 0
    PortB = Rnd(255)
    if __rseed < 1500 then
    __rseed = __rseed + 2
    Else __rseed = 0
    End If
    Waitms 100
    loop[/code:1]





    Gruß Maik

  • Ich hab jetzt eine Funktion hin bekommen. Funktionieren tut die auch.


  • Zitat von "MisterTitan"

    Ich hab jetzt eine Funktion hin bekommen. Funktionieren tut die auch.


    Ja, ist aber nicht wirklich zufällig!
    Simulier das mal und lass dir die Werte von PortB anzeigen!
    Die Wiederholen sich sehr schnell.


    Schau in die Doku, da stehen all diese einfachen Dinge drin:
    http://avrhelp.mcselec.com/bascom-avr.html?RND
    Bei den ___rseed müssen drei "_" anstelle von zwei (mein Fehler) stehen, dann geht das Listing auch damit!

  • Zitat von "MisterTitan"

    Hast du eine Ahnung wie ich in meiner Matrix Diagonale darstellen kann, also praktisch ein Strich der Diagonal leutet.


    Hehe... hier kommt wieder die Lernkurve: Mach das selbe mit PortB wie mit PortD: zur Potenz setzen: 1,2,4,8,16,32,64,128


    Oder einfach beide Ports auf den selben Wert? ;)


    Stefan Z

  • dann leutet ja nur eine Led ich möchte aber das dann die ganze Diagonale leutet, soweit wie ich das weiß, geht das garnicht so einfach. Weil wenn ich ja mein portd auf 0 gestellt hab, das ich die ganzen Zeilen aktiviert hab und ich dann Portb auf 1 setzt , leuchten ja dann alle Led's.




    Maik

  • Zitat von "MisterTitan"

    Weil wenn ich ja mein portd auf 0 gestellt hab, das ich die ganzen Zeilen aktiviert hab und ich dann Portb auf 1 setzt, leuchten ja dann alle Led's


    AHHRGH! :D


    Das ist doch gerade die Idee hinter einer gemultiplexten Matrix:
    Es leuchtet immer nur eine Zeile (und wenn die nur einen Pixel an hat, dann ist das so!).
    Daher Multiplext man diese Einzelzeilen und durch den schnellen Durchlauf kommt ein stehendes Bild zustande.
    Wenn du mehr als eine Reihe auf PortD aktivierst, dann wird der AVR mit X mal LED-Strom belastet - auf EINEM Port (Parallel-Schaltung).


    Codeschnippsel.. bitte passend einbauen...
    [code:1]
    Config Portb = Output
    Config Portd = Output
    Dim B As Byte


    B = 1 'Zähler auf 1 (erste LED)


    Do 'Hauptschleife - endlos
    While B < 128 'Binärwert für die Letzte LED erreicht?
    Portb = 0 'PortB kurz ausmachen, um Geisterbilder zu vermeiden
    Portd = Not B 'PortD ist bei dir ja direkt an die Kathoden gebunden,
    'daher NOT um den Binärwert zu invertieren
    Portb = B 'PortB können wir direkt mit dem Wert ansprechen
    B = B * 2 'Zähler verdoppeln (die Eins im Binärmuster wandert)
    Waitms 50 'Hier die entscheidende Pause!
    'Damit siehst du, wie die einzelnen Zeilen aktiv sind
    'Nachher wieder rausmachen!
    Wend 'Wenn 128 erreicht, Ende der Schleife
    B = 1 'Zähler wieder auf 1 zurücksetzen (erste LED)
    Loop 'Und nochmaaaaaaal!


    [/code:1]

  • Zitat von "MisterTitan"

    mit den Code leuchtet die Diagonale LED für LED, ich wollte aber das sie als ganzes leutet, das dürfte aber nicht so einfach sein.


    DOPPEL-AAAAHHHRGH!


    Schau mal in die Kommentare im Listing:
    [code:1] Waitms 50 'Hier die entscheidende Pause!
    'Damit siehst du, wie die einzelnen Zeilen aktiv sind
    'Nachher wieder rausmachen! [/code:1]


    Bei Multiplex-Anzeigen ist IMMER nur EINE Zeile aktiv.
    Das stehende Bild entsteht durch die Trägheit des Auges!
    Mach die Waitms 50 mal raus.

  • wenn ich euch beide mal kurz stören dürfte^^


    Hab noch eine Frage und zwar wie hoch darf ich den 2313 auf einem pin/port/insgesammt belasten?


    Weil rein Spannungstechnisch könnt ich ja auch ein paar P4s anlöten, aber ich schätze mal das dem AVR ein paar Ampere nich wirklich gut tun oder?


    Im Datenblatt hab ich nichts gefunden bzw weiß ich nich wo ich es dort finden soll


    thx
    Maik (grüße an titan \:D/ )

  • ja Moment!
    Eine Multiplex-Matrix zählt nicht (wie wir ja (hoffentlich) schon weiter oben festgestellt haben...).


    Und pro Beinchen jeweils 5 LEDs in Reihe verbrauchen ja auch nur 20mA (oder weniger, je nach System-Spannung.).


    Aber eine Power-LED wird unweigerlich zum Tod des AVRs führen - oder zumindest braucht er danach ein Holzbeinchen...


    Laut Datenblatt (S. 181) kann er pro Beinchen 40mA.


    Stefan Z

  • Zitat von "MisterTitan"

    Also, jetzt mal wieder zu der Diagonalen, wie funktioniert das jetzt so das ich die Komplete Diagonale wandern lassen kann.


    Tja.. dann überleg mal scharf ;)
    Is grad was spät für mich zum nachdenken...
    Ich kram die Tage mal das Listing von mir raus... Da haste dann zumindest alle Buchstaben und auch eine Routine zum Abstrahieren - d.h. du kannst z.B. mit Point(2,4) die 2. LED in der 4. Zeile aktiveren...


    Die einfachste Methode für dich wäre:
    [code:1]Do 'Hauptschleife
    For X = 0 to 255 '255 mal die Diagonale anzeigen
    PortD = not 1
    PortB = 1
    PortD = not 2
    PortB = 2
    PortD = not 4
    PortB = 4
    PortD = not 8
    PortB = 8
    PortD = not 16
    PortB = 16
    '[usw...] 'Je nach Anzahl der Zeilen/Spalten erweitern
    Next X


    For X = 0 to 255 '255 mal die um 1 versetzte Diagonale anzeigen
    PortD = not 1
    PortB = 2
    PortD = not 2
    PortB = 4
    PortD = not 4
    PortB = 8
    '[usw...]
    Next X


    For X = 0 to 255 '255 mal die um 2 versetzte Diagonale anzeigen
    PortD = not 1
    PortB = 4
    PortD = not 2
    PortB = 8
    PortD = not 4
    PortB = 16
    '[usw...]
    Next X
    Loop[/code:1]


    Bei den [usw...] musst du dann jeweils noch genügend Schritte einbauen.
    Hier wird halt jedes Einzelbild der scrollenden diagonale "zu Fuß" erzeugt.

  • Zitat von "MisterTitan"

    irgenwie funktioniert das nicht so wirklich


    Wäre interessant zu wissen, was denn überhaupt passiert...


    Aber es wird Zeit dass du mal lernst den Simulator zu bedienen:
    1- Compiliere das Listing und klicke dann auf den "Simulate Program" Knopf...
    2- Die interessanten Variablen in der Liste eintragen: X, Portb, PortD.
    3- "Update Variables" aktivieren (sorgt dafür, dass beim Durchlaufen die Variablen weiterhin aktualisiert werden, normalerweise passiert das nur, wenn man den Durchlauf stoppt.)
    4- Den "Play" Knopf drücken und die Variablen beobachten.
    5- Oder von Hand immer eine Zeile weiterspringen, damit du dir vorstellen kannst was passiert.
    6- Fehler finden und korrigieren, dann nochmal neu ab Schritt 1 bis alles stimmt...