Angepinnt 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.

      $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)
      Waitms 15
      Loop[code:1]


      Gruß Maik[/code:1]

      "MisterTitan" schrieb:

      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:
      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!

      "MisterTitan" schrieb:

      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

      "MisterTitan" schrieb:

      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]

      "MisterTitan" schrieb:

      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

      "MisterTitan" schrieb:

      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.

      "MisterTitan" schrieb:

      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...