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

  • Zitat von "MisterTitan"

    ich bin gerate dabei bei Reichelt was zu bestellen, weist du was ich für Mosfets bei Reichelt bestellen kann.


    Mir wurde hier im Forum mal zu IRL 530NS geraten...
    Oder auch BUK101-50GL...
    Es gehen alle, die bei Logic-Level (also so um die 5V) voll durchschalten.
    Je geringer der Widerstand, desto weniger Wärmeverlust...


    Stefan Z

  • kann ich auch die c33725 nehmen, ich habe auch noch diverse IC´s z.B.
    74HC4094N und HEF4050BP tonenweise zu Hause rumliegen, kann ich damit auch irgendetwas anfangen, ich weiß ja nicht ob die zu irgendwas zu gebrauchen sind.



    Und mal was anderes, der L7805 ist ein Spannungsregler, bin ich da richtig oder Irre ich mich da jetzt.


    Gruß Maik

  • Zitat von "MisterTitan"

    kann ich auch die c33725 nehmen, ich habe auch noch diverse IC´s z.B.
    74HC4094N und HEF4050BP tonenweise....der L7805 ist ein Spannungsregler....


    Google ist dein Freund!


    c33725 - NPN General Purpose Amplifier
    sollte glaubich auch gehen, ja... Schau, ob er bei 5V schaltet...


    74HC4094N - 8-stage shift-and-store bus register
    Kann praktisch sein - auf jeden Fall mal behalten


    HEF4050BP - HEX non-inverting buffers
    Da bin ich mir echt nicht sicher ;)


    L7805 - POSITIVE VOLTAGE REGULATOR
    Ja, sowas wie der LM317... linearer Spannungsregler.


    jeweils die Namen reichen auf Google schon für Datasheets - mehr brauchst du nicht.
    (plus Verständnis für die Materie, aber das musst du dir antrainieren...).


    Stefan Z

  • Ich habe Jetzt ein mächtiges Problem, und Zwar :


    Hab ich mir gerade eine Matrix 7x7 gebastelt und sie geht ab nicht so wie sie soll. Ich habe eine Art Lauflicht über 2 zeilen also erste Zeile hin und zweite Zeile zurück. die funktion geht zwar, aber es leuchten immer in anderen Zeilen noch led´s mit. an was Liegt das



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



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



    Warten = 50



    Do
    Portd = 11111110
    Portb = 00000001
    Waitms Warten
    Portd = 11111110
    Portb = 00000010
    Waitms Warten
    Portd = 11111110
    Portb = 00000100
    Waitms Warten
    Portd = 11111110
    Portb = 00001000
    Waitms Warten
    Portd = 11111110
    Portb = 00010000
    Waitms Warten
    Portd = 11111110
    Portb = 00100000
    Waitms Warten
    Portd = 11111110
    Portb = 01000000
    Waitms Warten
    Portd = 11111101
    Portb = 10000000
    Waitms Warten
    Portd = 11111101
    Portb = 01000000
    Waitms Warten
    Portd = 11111101
    Portb = 00100000
    Waitms Warten
    Portd = 11111101
    Portb = 00010000
    Waitms Warten
    Portd = 11111101
    Portb = 00001000
    Waitms Warten
    Portd = 11111101
    Portb = 00000100
    Waitms Warten
    Portd = 11111101
    Portb = 00000010
    Waitms Warten
    Portd = 11111101
    Portb = 00000001
    Waitms Warten
    Portd = 11111101
    Portb = 00000000
    Waitms Warten
    Portd = 11111111
    Portb = 00000000
    Waitms 250




    Loop
    [/code:1]



    Bitte Helft Mir


    Gruß Maik

  • Hihi - du hast den Fehler in meinem Lauflicht-Source gefunden ;)
    Binäre Schreibweise ist dein Freund an dieser Stelle.
    Und zwar die 2er Potenzen:
    00 - XXXXXXXX
    01 - XXXXXXXO
    02 - XXXXXXOX
    04 - XXXXXOXX
    08 - XXXXOXXX
    16 - XXXOXXXX
    32 - XXOXXXXX
    46 - XOXXXXXX


    Die machen je nur EINE LED der Gruppe an...
    Such mal auf google nach "Binärtabelle"".


    Stefan Z

  • Zitat von "MisterTitan"

    Kannst du mir nicht einmal so ein Lauflich schreiben, ich bin noch nicht so weit in der Programmiersprache, ich werde das bestimmt nicht so toll hinbekommen wie du. :roll: :roll:


    Dann wird die Lernkurve aber flacher ;)


    Sag mir mal genau, was portB und was PortD sind (Anoden, Kathoden der Matrix).


    Im Prinzip macht er ja nix anderes, als die Pins entsprechnd dem Binärwert 1 oder 0 zu setzen.
    Die gemeinsamen Kathoden der Reihen sprichst du immer nur mit 1/2/4/8/16/32 an (darf ja nur eine Spalte aktiv sein, ansonsten wird der AVR überlastet.)
    Dann schreibst du einen beliebigen Wert von 0-255 (ein Byte, 8 Bit) in den Port der die Reihen kontrolliert. Welche LEDs angehen, verrät dir diese Tabelle.
    0 macht alle aus, 255 alle acht an.
    Dann schaltest du zuerst die Spalten wieder auf 0 (damit beim Wechsel Reihen keine Geisterbilder auftauchen)
    :!: Dann die Reihe wechseln (ich multipliziere einfach mit 2 in einer While-Schleife, solange Spalte < 32) und in das Portregister schreiben.


    Wirklich kompliziert wirds doch erst, wenn du die eine Routine zur Abstraktion bastelst - damit du wie auf einem Display einzelne Pixel setzen kannst ;) Hab ich aber z.B. auch hier, kommt dann ;)


    Stefan Z

  • :!: also es ist eine 7x7 Matrix, portb ist Plus bei den LED's und portd ist Minus bei den LED's. Die Tabelle hab ich auch schon ausgedruckt. Ich kann nur auf meine weise 7x7 betreiben weil ich ja nur 7 out's von portd habe, ich benutzte den attiny2313 wie du gesehen hast. Ich habe das Board von Pollin für 15€ und da kann ich porta nicht rausführen, da bekomm ich nur 8x portb und 7x portd raus, und denn attiny mit auf die Platine zupacken möcht ich noch nicht, weil ich dann ja sonst ständig
    von Board zu Board den Chip tauschen muss und auf die Dauer wird das den Chip auch nicht gefallen.



    Gruß Maik

  • [code:1]


    $regfile = "2313def.dat" 'definieren des verwendeten Chips Hier ist es ein ATMega8
    $crystal = 8000000 ' Die Quarzeinstellung / Taktgeschwindigkeit
    $hwstack = 32
    $swstack = 10
    $framesize = 40


    'Pinconfiguration hier alle B und D Pins als Ausgänge
    Config Portb = Output
    Config Portd = Output
    Dim Warten As Byte



    Warten = 50



    Do
    Portd = 126
    Portb = 1
    Waitms Warten
    Portd = 126
    Portb = 2
    Waitms Warten
    Portd = 126
    Portb = 4
    Waitms Warten
    Portd = 126
    Portb = 8
    Waitms Warten
    Portd = 126
    Portb = 16
    Waitms Warten
    Portd = 126
    Portb = 32
    Waitms Warten
    Portd = 126
    Portb = 64
    Waitms Warten
    Portd = 126
    Portb = 128


    Waitms 250


    Loop
    [/code:1]


    ist das so richtig, also ich kann mich noch schwach an die Ampelsteuerung in Basic über den LPT-Port erinnern, da wird ja immer wenn mehrere Ausgänge schalten soll die Zahlen immer zusammen addiert. Ich habe jetzt eine Reihe mal probiert und es Geht.




    Gruß Maik

  • Ich habs hinbekommen mit dem Lauflicht von open nach unten und wieder zurück. Aber kann man das nicht auch einfacher machen als wie jedes lämpchen einzeln anzusteuern. Meine Bstellung bei Reichelt ist auch endlich gekommen, jetzt hab ich noch einen Mega16 und Mega8 zum üben bekommen.




    Gruß Maik

  • Zitat von "MisterTitan"

    Aber kann man das nicht auch einfacher machen als wie jedes lämpchen einzeln anzusteuern.


    Klar geht das... Dafür schreibt man sich ne Routine!
    Das was ich vorher meinte: n einzelnes Licht, das wandert, kann man auch binär als 1,2,4,8,16,32,64 beschreiben.
    Fang mit A=1, PortB=A an und dann multipliziere mit 2 - solange, wie A<64 ist (bei 8 LEDs).


    [code:1]
    Do 'Endlosschleife
    A = 1 'erstmal das erste Lichtlein anmachen
    While A < 64 'solange das letzte Licht nicht an war -> Schleife
    PortB = A 'die LEDs anschalten, die binär A entsprechen
    A = A * 2 'da immer nur eine LED leuchten soll, mit 2 multiplizieren
    Waitms 30 'etwas warten, damit mans sehen kann
    Wend 'wieder in die Schleife
    A = 1 'falls Schleife beendet -> erste Lampe wieder an
    Loop 'Endlosschleife
    [/code:1]

  • Also ich weiß absolut nicht wie ich das mit der routine schreiben soll.


    Was ist bei den Code das A



    [code:1]


    Do 'Endlosschleife
    A = 1 'erstmal das erste Lichtlein anmachen
    While A < 64 'solange das letzte Licht nicht an war -> Schleife
    PortB = A 'die LEDs anschalten, die binär A entsprechen
    A = A * 2 'da immer nur eine LED leuchten soll, mit 2 multiplizieren
    Waitms 30 'etwas warten, damit mans sehen kann
    Wend 'wieder in die Schleife
    A = 1 'falls Schleife beendet -> erste Lampe wieder an
    Loop 'Endlosschleife [/code:1]



    Kannst du nicht mal was kleines schreiben oder so, damit ich sehen kann wie das auszusehen hat, ich weiß absolut nicht wie ichs machen soll.




    Gruß Maik

  • ich hab das jetzt einfach mal in bascom geschrieben, weiß aber nicht ob es funktioniert weil ich zur zeit an einer größeren Matrix arbeite.
    Syntax hat er mir keine Fehler gezeigt, also denk ich mir mal das das richtig ist.
    Hier ist mal der Code


    [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 'Endlosschleife
    A = 1 'erstmal das erste Lichtlein anmachen
    While A < 64 'solange das letzte Licht nicht an war -> Schleife
    PortB = A 'die LEDs anschalten, die binär A entsprechen
    A = A * 2 'da immer nur eine LED leuchten soll, mit 2 multiplizieren
    Waitms 30 'etwas warten, damit mans sehen kann
    Wend 'wieder in die Schleife
    A = 1 'falls Schleife beendet -> erste Lampe wieder an
    Loop 'Endlosschleife[/code:1]




    Gruß Maik