- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 27

Thema: Einfache Schreibweise einer 5-Bit Wahrheitstabelle

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Das mit dem "Bit_Pattern" habe ich noch nicht so ganz verstanden. Bit_Pattern ist eine als Byte definierte Variable, hat aber dennoch Aus- oder Eingangs-Nummerierungen. Wie funktioniert das und was bewirkt es genau?
    Korrekt - Programmwahl ist eine Byte-Variable, die demzufolge aus 8 einzelnen Bits besteht: Programmwahl.7, Programmwahl.6, Programmwahl.5.... usw.
    Bei Bascom kann man jedes einzelne Bit eines Bytes nach diesem Muster setzen, löschen, abfragen etc., etc.

    Soweit habe ich verstanden, dass ich die einzelnen Portpins ja ein- und abschalten kann, würde mit DDRA = &B00011111 ja auch gehen, korrekt?
    Das ist nicht ganz korrekt. Das DDR-Register legt fest ob ein Anschluss als Ausgang (d.h. führt "aktive" Pegel High oder Low) oder als Eingang (führt keinen eigenen Pegel) konfiguriert ist. Beim Einschalten des Controllers sind alle I/O-Ports erstmal als Eingänge konfiguriert, da sie so keinen Schaden anrichten können.

    Ist ein Anschluss als Eingang konfiguriert, ist der logische Pegel, der an diesem Eingang anliegt, im entsprechenden PIN-Register.
    Legst Du also z.B. den als Eingang konfigurierten Anschluss B.2 auf +5V, ist das Bit PINB.2 "1". Liegt der Anschluss auf Masse, wird PINB.2 = 0.

    Wenn ein Anschluss aber als Ausgang definiert ist, muss ja irgendwo festgelegt werden, ob dieser Ausgang ein High oder ein Low führen soll - und genau das macht das PORT-Register. Willst Du z.B. C.3 als Ausgang haben und mit einem High-Pegel eine LED leuchten lassen, müsstest Du folgendes schreiben:
    DDRC.3=1
    PORTC.3 = 1

    Das PORT-Register hat aber noch eine wichtige Aufgabe, und zwar dann, wenn der Anschluss als Eingang konfiguriert ist:
    Dadurch dass die Eingänge sehr hochohmig sind (mehrere 100 MOhm) fangen sie jede Menge Störstrahlungen ein, wenn sie frei in der Luft hängen. Wenn Du also z.B. einen Eingang mit einem Taster auf +5V legst, wird er bei gedrücktem Taster zwar eine saubere "1" sehen. Bei offenem Taster befindet er sich aber in einem vollkommen undefinierten Zustand; oft führt 50Hz-Einstrahlung dazu, dass sich der logische Pegel ständig ändert. Eingänge dürfen also nie frei in der Luft hängen, sondern sollten über einen hochohmigen Widerstand (z.B. 50kOhm) auf +5V oder Masse gelegt werden. Liegt der Eingang z.B. auf +5V, kann man ihn über einen Taster trotzdem problemlos auf 0V ziehen, ohne dass ein nennenswerter Strom fließt - ist der Taster offen, liegt am Eingang ein sauberes "High" an.

    Solche Widerstände nennt man PullUp- (oder PullDown-) Widerstände, und die Controller haben sie schon eingebaut! Sie werden allerdings nur dann aktiv, wenn im dazugehörigen PORT-Register eine 1 steht.

    Also nochmal zusammengefasst:

    DDRDX.Y legt fest, ob der Anschluss X.Y ein Eingang oder Ausgang sein soll.
    Ist er ein Ausgang, legt PORTX.Y fest, ob der Ausgang eine 1 oder eine 0 führt.
    Ist er ein Eingang, kann man an PINX.Y sehen, ob an diesem Eingang eine 1 oder 0 anliegt.
    Und ist er ein Eingang, kann man mit PORTX.Y = 1 den PullUp-Widerstand aktivieren, der den Eingang auf ein sauberes High zieht.

    Ich habe daheim eines DER (angeblich) besten Bascom-AVR-Bücherfür Einsteiger daheim, aber sowas steht da nicht drin.
    Ich habe auch einen Haufen BASCOM-Bücher gekauft - aber zum ersten mal verstanden habe ich es mit dem Buch von Roland Walter

  2. #2
    Hi Sauerbruch.

    Und noch einmal muss ich mir bei dir herzlichst bedanken. Deine Hilfe weiß ich wirklich extrem zu schätzen - wirklich zu schätzen. Mit Hilfe deiner Erläuterungen habe ich mehr verstanden als gedacht ^^.
    Das mit den PullUp-Widerständen hatte mir vor 4 Monaten bereits ein guter Freund erklärt. Anfänglich hatte ich Pull-Down-Widerstände per Hardware gesetzt, was sich bei einem PWM-Eingangssignal nicht negativ auswirkt. Bei meinen letzten Projekten jedoch, u.A. einer Taster-gesteuerten Hardware, gab es jedoch extreme Probleme, weshalb ich die Eingänge mit PullUp's gegen VDD ziehen musste.

    Die internen PullUp's setze ich mittlerweile eigentlich nie, sondern verwende Hardware-Widerstände mit 4,7K, welche ich gegen +5V parallel zum Taster schalte. Zwar habe ich keine Taster am ATMega8515, sollte aber trotzdem funktionieren ^^.

    Das ist der letzte Versuch, den ich ich mit einem Buch starte, der absolut letzte. Das Buch von Roland Walter scheint genau das zu sein, was ich suche: Es wird ausschließlich Bascom beschrieben und alles am Beispiel eines ATMega8. Mehr braucht es im Grunde nicht, denke ich. Und da es sich um ein Schul-Lehrbuch handelt, sollte alles gut und verständlich abgehandelt sein/werden.

    Ich denke, dass ich heute nichts mehr am Programm schreibe, dafür aber sicher morgen noch. Wenigstens die Eingänge möchte ich so konfigurieren und die entsprechenden Konfigs mit einem einfachen Testprogramm ausprobieren. Nächste Woche habe ich aber wieder weitaus mehr Zeit dafür, sowohl zwischen Weihnachten und Neujahr.

    Und damit du siehst, dass ich u.A. mit eurer Hilfe auch durchaus praktische Anwendungen umsetze - hier ein kleines Demo-Video von mir ^^. Der in der Steuerung verwendete ATMega8 wird auch in der 24-Port-Steuerung verwendet, muss jedoch noch zusätzlich ein Display und den ATMega8515 ansteuern. Krieg ich hin ^^.





    Danke dir.


    LG - Maik

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Hey, das Projekt ist ja schon ganz schön weit fortgeschritten - und die Plexiglas-Gehäuse sind wirklich sehr edel!!

    Anfänglich hatte ich Pull-Down-Widerstände per Hardware gesetzt, was sich bei einem PWM-Eingangssignal nicht negativ auswirkt.
    Klar wirkt sich hier ein PullUp-Widerstand nicht negativ aus - aber in diesem Fall brauchst Du ihn gar nicht: Der Eingang ist ja mit einem Ausgang verbunden (dem PWM-Signal), und dieser Ausgang liefert ja ganz zuverlässige High- und Low-Pegel! Den Widerstand brauchst Du nur, wenn der Eingang über einen Taster (oder Schalter) angesteuert wird, damit ein definierter Pegel hergestellt wird, wenn das Bauteil geöffnet ist. Aber wenn der Eingang an irgendeiner "aktiven" Quelle hängt (kann auch der Ausgang eines CMOS-Gatters, eine Transistorschaltstufe oder sonstwas sein), ist er überflüssig.

    Die internen PullUp's setze ich mittlerweile eigentlich nie, sondern verwende Hardware-Widerstände mit 4,7K, welche ich gegen +5V parallel zum Taster schalte.
    Das heißt, sowohl der PullUp als auch der Taster geht nach +5V? Das würde keinen Sinn machen, denn dann ist der Eingang immer auf High!!
    Wenn Du gerne lötest, sind Hardware-PullUps eine feine Sache... aber bei geschätzt einigen hundert Millionen Anwendungen funktionieren die internen Widerstände ganz ausgezeichnet

  4. #4
    Hallo Sauerbruch und
    lieben vielen Dank für das Lob . Weiß ich zu schätzen ^^

    Ok. Also wenn ich in Zukunft wieder einmal einen Controller mit einem anderen verbinde, brauchen die Eingänge des Slave keinen PullUp-Widerstand. Sehr gut - spart ein wenig Ressourcen ^^.

    Nein, das habe ich vermutlich falsch ausgedrückt. Die Eingänge sind mit PullUp-Widerständen versehen, korrekt. Die Taster hingegen sind gegen 0V geschaltet, ziehen den Eingang also bei Betätigung gegen 0V. Wenn ich das noch recht in Erinnerung habe, bricht durch diese Art "Kurzschluss" nach dem PullUp-Widerstand der anliegende (sehr kleine) Strom am Eingangsport zusammen und fällt unter 1V - ein Low-Signal

    Bei meinen ersten Versuchen, auf ein High-Signal als Eingangssignal zu setzen, was katastrophal. Der Controller machte, was er wollte, nur nicht das, was er sollte ^^.

    Kann ich die internen PullUp-Widerstände eigentlich auch mit dem Befehl "PortX = &HFF" setzen?

    Ich habe da noch eine Frage zu deinem Beispiel in Antwort #5:

    Code:
    Programmwahl = PINA        'Übernimmt das komplette Eingangsregister von PortA
    Programmwahl = Programmwahl AND &B00011111  'Löscht die Bits 7...5 und lässt die Bits 4...0 unverändert
    In dem für mich verständlichen Programmierdeutsch ^^ würde das jetzt so aussehen:


    Code:
    Programmwahl = PINA                       ' Hier werden alle Pins mit der Variable "Programmwahl" definiert (benannt)
    Programmwahl = Programmwahl AND &B00011111       ' Die ersten 3 Bits sind gelöscht oder Ausgänge, während die letzten 5 als Eingänge anwählbar sind
    PinA = &HFF         ' Würde die internen PullUp-Widerstände aktivieren, alternative Schreibweise wäre "PinA = 1"???
    
    DIM Programm as Byte
    Dim Programmwahl as Byte      ' Kann ich diese Variablendeklaration auch weglassen???
    Do
    
    Select Case Programmwahl
         Case &B00001 : Programm = 1
         Case &B00010 : Programm = 2
         Case &B00011 : Programm = 3
         Case &B00100 : Programm = 4
         etc.pp
    Abgesehen vom Header wäre das dann auch schon das gesamte Einlese-Prozedere?


    LG - Maik

    - - - Aktualisiert - - -

    Nachtrag: Das, was du da im Video siehst, ist die erste RGB-Steuerung, die ich selbst aufgebaut habe. Das Gehäuse aus qualitativ hochwertigsten Acyralglas (kratzfester als das überteuerte Bastlerglas aus dem Baumarkt - und günstiger noch dazu ^^) baue ich ebenfalls selbst. Da ist nix CNC oder mit Präzisionsmaschinen gemacht. Eine Dekupiersäge, eine Ständerbohrmaschine (mit der ich auch "fräse" sowie eine Bügel-Laubsäge mit 360°-Sägeblatt ^^.

    Habe aber leider bei dieser Steuerung vergessen, die Kabelfernbedienung mit einem Stecker zu versehen. Das Kabel hat zwar einen Stecker, jedoch wird der fix auf die Mitte der Platine gesteckt. Für mich daheim aber vollkommen ausreichend ^^.


    LG _ Maik
    Geändert von stardust19322 (14.12.2014 um 13:25 Uhr)

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Nein, die beiden Codezeilen sind etwas anders zu verstehen.

    Wenn Du in Bascom X = A schreibst, bezeichnet "X" eine Variable um die es geht, und "A" den Wert, den sie haben soll. Konkret also z.B.

    Dim Zähler as Byte
    Zähler = 20
    Zähler = Zähler + 1

    (Zähler hätte am Schluss den Wert 21.)

    Da ein Byte 8 Bits hat, könnte man statt der 20 auch den Binärwert schreiben:
    Zähler = &b00010100

    Oder Hexadezimal:
    Zähler = &h14

    Du kannst einer Variablen aber nicht nur einen numerischen Wert (also eine Zahl) zuweisen, sondern auch gleich direkt den Inhalt eines Registers:
    Dim Programmwahl as byte
    Programmwahl = PINA

    Damit nimmt die Variable Programmwahl den Wert an, der gerade im 8-bit-Register PINA steht.

    Zur Erinnerung: Im Register PINA steht das Muster aus Einsen und Nullen, das an den Anschlüssen A.7 bis A.0 anliegt (vorausgesetzt sie sind per DDR-Register als Eingänge konfiguriert). Diesem Register kannst Du also nicht auf Befehlsebene einen Wert zuweisen, sondern sein Inhalt hängt ausschließlich von den Highs und Lows an den Anschlüssen ab. PINA = XYZ macht also keinen Sinn - man kann dieses Register nur auslesen, d.h. XYZ = PINA.
    Liegt also z.B. an den Anschlüssen A.4, A.2 und A.0 ein High (und an den anderen ein Low), stünde im Register PINA der Wert &b00010101. Mit dem Befehl Programmwahl = PINA übernimmst Du also das "Muster" aus Highs und Lows aus dem Register PINA direkt in Deine Variable Programmwahl. Klar?

    Jetzt könnte es ja aber sein, dass Du die Anschlüsse A.7, A.6 und A.5 für was ganz anderes brauchst - zu den Bits, die die Programmwahl steuern, gehören sie ja definitiv nicht. Du kannst aber nur das ganze Register PINA auf die Variable Programmwahl übertragen. Wenn also nur die Bits Programmwahl.4 bis Programmwahl.0 ausgewertet werden sollen, musst Du gegebenenfalls die höchsten 3 Bits der Variable Programmwahl auf 0 setzen. Das geht entweder einzeln:

    Programmwahl.7 = 0
    Programmwahl.6 = 0
    Programmwahl.5 = 0

    oder eben am Stück, indem Du die oberen 3 Bits mit einer 0 Und-verknüpfst (das Ergebnis einer UND-Verknüpfung mit 0 ist immer 0), und die unteren 5 Bits mit einer 1 UND-Verknüpfst (das Ergebnis ist immer die Ausgangsvariable selbst: 0 UND 1 = 0, 1 UND 1 = 1).

    Kurz und gut: Programmwahl = Programmwahl AND &b00011111 setzt die obersten 3 Bits der Variable auf 0, egal was vorher drin gewesen war, während die unteren 5 Bits unverändert bleiben.
    Geändert von Sauerbruch (14.12.2014 um 14:37 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.716
    Blog-Einträge
    133
    Zitat Zitat von stardust19322 Beitrag anzeigen
    Abgesehen vom Header wäre das dann auch schon das gesamte Einlese-Prozedere?
    Eigentlich ja. Ich habe noch die blau gefärbten Kommentare eingefügt, die meiner Meinung nach besser passen. Für aktive Pullupwiderstände muß der Portpin als Eingang konfiguriert sein und im PORT Register das entsprechende Bit auf 1 gesetzt werden.


    Code:
    Programmwahl = PINA                       'Hier werden alle Pins mit der Variable "Programmwahl" definiert (benannt)
                                              'Hier wird der Zustand aller Pins von PortA in die Variable Programmwahl übertragen.
    Programmwahl = Programmwahl AND &B00011111       'Die ersten 3 Bits sind gelöscht oder Ausgänge, während die letzten 5 als Eingänge anwählbar sind
                                                     'Die ersten 3, nicht zu beachtenden Bits werden auf 0 gesetzt.
    PinA = &HFF         'Würde die internen PullUp-Widerstände aktivieren, alternative Schreibweise wäre "PinA = 1"???
    PortA = &HFF        'Würde die internen PullUp-Widerstände aktivieren, alternative Schreibweise wäre "PortA.0 = 1 , PortA.1 = 1, ...
    
    DIM Programm as Byte
    Dim Programmwahl as Byte      'Kann ich diese Variablendeklaration auch weglassen???
                                  'Nein. Wird dir der Compiler aber schon melden. Ist kein in Bascom vordefinierter String sondern eine Anwendervariable und muß vor erster Verwendung deklariert sein.
    Do
    
    Select Case Programmwahl
         Case &B00001 : Programm = 1     'Hier könnten jetzt schon Aufrufe von Unterprogrammen stehen. Das was "Programm" zugewiesen wird steht ja schon in "Programmwahl".
         Case &B00010 : Programm = 2
         Case &B00011 : Programm = 3
         Case &B00100 : Programm = 4
         etc.pp

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  7. #7
    Aaaah - jetzt hats Klick gemacht. Daaaaanke seeehr. Bin dir ein Bier schuldig ^^.
    Mit Pin und Port hatte ich schon immer meine ganz kleinen schwierigkeiten, sobald ich aber direkt im Programm stecke, ist das weg. Weiß auch nicht - vermutlich der Unterschied zwischen Theorie und Praxisnähe, was im Kopf nen Schalter umlegt.

    Klar, kein Thema. Es war nur ein Beispiel, nach jedem Case in der Select eine Variable zu definieren. Im späteren Programm rufe ich hingegen gleich die anschließend fertig geschriebenen Unterprogramme auf, mit "Call XYZ", also "Case &B00000101 : Call Sub Muster_5" ...und die dazu passende Call ^^.


    Bislang bin ich nun gewappnet. Morgen muss ich wieder auf Montage, da habe ich dann abends Zeit zum Programmieren, wenn ich das nicht verschwitze. Ein Regal mit 24 Fächern soll in unterschiedlichen Modulen leuchten - habe dazu eigens ein 12V_10A Vorschaltgerät gekauft. Dauert aber halt noch etwas.

    Vorteil: Das Programm auf dem ATMega8, welches die Farben ansteuert, ist im Großen und Ganzen schon fertig. Allerdings will ich noch ein Display und Cursortaster einbinden, plus eben die Auswahlmöglichkeit der unterschiedlichen Module.


    Die Haupt-Steuerplatine für die ersten 12 Ports schaut dann so aus:

    Klicke auf die Grafik für eine größere Ansicht

Name:	24-Port Platine 1_Vorderseite.jpg
Hits:	11
Größe:	53,0 KB
ID:	29501

    Zur Erläuterung: Die Pinbank rechts neben dem ATMega8 hat oben 4 Taster als Eingang, darunter Spannungsversorgung und Display-Ansteuerung.
    Die Ausgänge des ATMega8 sind an den Hardware-PWM-Registern angeschlossen, OC1A, OC1B und OC2. Sie steuern die Farben und das Fading.
    Die untersten Transistoren schalten die Spannungsversorgung und werden durch den ATMega8515 angesteuert.
    Die Pinbänke links werden anschließend zur 2ten Platine gelegt, welche die letzten 12 Ports beinhaltet.

    Finde das echt klasse und ärgere mich tierisch, dass ich das nicht schon viel früher mit dem Programmieren begonnen habe...


    LG - Maik
    Geändert von stardust19322 (14.12.2014 um 19:09 Uhr)

  8. #8
    Hallo.

    @ Searcher: Das, was du als Beispiel geschrieben hast, funktioniert leider nicht. Die Eingangsports können nicht an eine Variable übergeben werden. Wenn ich die Variable entsprechend als Byte deklariere und dem Port mit "Programm = PINA" zuweise, kann ich machen was ich will - das Register reagiert nicht auf Tastenbefehle.
    Schreibe ich allerdings z.B. "If PinA.0 = 0 then ...etc.pp", dann klappt alles.
    Denke, dass ich die Wahrheitstabelle vielleicht so aufbaue, mit direktem Portzugriff.
    Da ich keine weiteren Ports benötige, sollte das funktionieren, denke ich.
    Mal probieren.


    LG - Maik

Ähnliche Themen

  1. Kurze Schreibweise bei If- Bedingung in Bascom?
    Von rylix im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 17.06.2011, 16:58
  2. Ersten 8 bit einer 32 bit Zahl auslesen
    Von C_Classic im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 23.05.2010, 00:06
  3. TTL Logik Wahrheitstabelle
    Von Micha.Berlin im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 26.05.2008, 22:32
  4. Ein bestimmtes Bit einer Variable überschreiben
    Von Dane im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 15.04.2006, 14:00
  5. Antworten: 5
    Letzter Beitrag: 30.06.2005, 16:51

Berechtigungen

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

LiFePO4 Speicher Test