Kani-Coaching (C lernen mit Nomis)

Kani

Neues Mitglied
07. Jan. 2009
339
0
0
Spenge
Sprachen
So, hier der Thread. Ich werde mich anstrengend, um Dir und mir Nerven zu sparen.

Womit fangen wir an?
 
Ganz einfach: Schreib mir ein Programm mit dem ich mit 8 Tasten 8 LEDs steuern kann. Wenn eine Taste gedrückt ist soll einfach die dazugehörige LED leuchten.
 
Wenn die jeweilige LED nur solange leuchtet solange der jeweilige Taster gedrückt bleibt, wird man das Prellen kaum erkennen können.
Also: Für den Anfang nicht nötig.
 
Code:
#include (avr/io.h>;

int main (void)
{
    //Ports schalten
    DDRA = 0b00000000;    //LEDs auf Eingang (Anode an VCC)
    PORTA = 0b11111111;    //Pullups aktiv. (=LEDs aus)
    
    DDRB = 0b00000000;        //Taster auf Eingang
    PORTB = 0b00000000;        //Pullups aus    Taster "aus"
    
    //Variablen definieren
    
    

    while(1)
    {
        if( ! (PINB & (1 << PB0) ))
        {
            PORTA &= ~(1 << PA0);
        }
        else if( ! PINB & (1 << PB1) ))
        {
            PORTA &=~(1 << PA1);
        }
        else if( ! PINB & (1 << PB2) ))
        {
            PORTA &=~(1 << PA2);
        }
        else if( ! PINB & (1 << PB3) ))
        {
            PORTA &=~(1 << PA3);
        }
        else if( ! PINB & (1 << PB4) ))
        {
            PORTA &=~(1 << PA4);
        }
        else if( ! PINB & (1 << PB5) ))
        {
            PORTA &=~(1 << PA5);
        }
        else if( ! PINB & (1 << PB6) ))
        {
            PORTA &=~(1 << PA6);
        }
        else if( ! PINB & (1 << PB7) ))
        {
            PORTA &=~(1 << PA7);
        }
    }
return 0;
}
 
Du hast doch nichtmal versucht das zu kompilieren oder? Also richtig machen und vor dem Posten ausprobieren.!
 
Code:
#include <avr/io.h>

int main (void)
{
    //Ports schalten
    DDRA = 0b00000000;    //LEDs auf Eingang (Anode an VCC)
    PORTA = 0b11111111;    //Pullups aktiv. (=LEDs aus)
    
    DDRB = 0b00000000;        //Taster auf Eingang
    PORTB = 0b00000000;        //Pullups aus    Taster "aus"
    
    //Variablen definieren
    
    

    while(1)
    {
        if( ! (PINB & (1 << PB0) ))
        {
            PORTA &= ~(1 << PA0);
        }
        if( ! (PINB & (1 << PB1) ))
        {
            PORTA &=~(1 << PA1);
        }
        if( ! (PINB & (1 << PB2) ))
        {
            PORTA &=~(1 << PA2);
        }
        if( ! (PINB & (1 << PB3) ))
        {
            PORTA &=~(1 << PA3);
        }
        if( ! (PINB & (1 << PB4) ))
        {
            PORTA &=~(1 << PA4);
        }
        if( ! (PINB & (1 << PB5) ))
        {
            PORTA &=~(1 << PA5);
        }
        if( ! (PINB & (1 << PB6) ))
        {
            PORTA &=~(1 << PA6);
        }
        if( ! (PINB & (1 << PB7) ))
        {
            PORTA &=~(1 << PA7);
        }
    }
return 0;
}

0 Errors, 0 Warnings....
 
Probiert hast du es aber sicher noch nicht!!! Ich hab ein Tutorial geschrieben! Extra für dich, denn andere Anfänger machen sich nämlich selbstständig die Mühe es zu verstehen. Les dir das durch und ignorier die Rechtschreib und Grammatik -fehler. Versuche zu verstehen was es mit diesem ganzen |= << & ~ auf sich hat. Danach schaust du dir die DDR PORT und PIN Register in einem anderen Tutorial oder dem Datenblatt genauer an!!!
Wenn du wieder ein Programm postest das nicht funktionieren KANN, mach ich nicht mehr mit und schreibe allen aktiven Usern eine PM dir nicht mehr zu helfen.
 
Hi Nomis,

Probiert hast du es aber sicher noch nicht!!! Ich hab ein Tutorial geschrieben! Extra für dich, denn andere Anfänger machen sich nämlich selbstständig die Mühe es zu verstehen. Les dir das durch und ignorier die Rechtschreib und Grammatik -fehler. Versuche zu verstehen was es mit diesem ganzen |= << & ~ auf sich hat. Danach schaust du dir die DDR PORT und PIN Register in einem anderen Tutorial oder dem Datenblatt genauer an!!!
das glaube ich auch ...
Ich sach da aber nix zu. Dein Posting sagt wohl genug.

Wenn du wieder ein Programm postest das nicht funktionieren KANN, mach ich nicht mehr mit ...
@Kani : Spiel den Quellcode im Kopf durch so als ob du ihn ausführen
müßtest. Und sieh dir mal an, was an deinem Prozessor an Pheripherie
(Bedienteile wie Taster, LEDs) angeschlossen ist und welche Pegel es
braucht um zu leuchten zu tuten oder was weiß ich und was die Taster
oder andere Eingabegeräte dir welche Pegel an die Pins legen usw.
Du hast IMMER noch total banale Anfängerfehler drin, die du eigentlich
selber OHNE Probleme erkennen solltest. Es kommt einem beinahe vor
als ob du das Programm einfach mit Copy und Paste zusammenkloppst
und dann mal auf Compile klickst. Wenn dann "0 Errors, 0 Warnings"
rauskommt funktioniert das Programm. So ist es leider nicht. Das sagt
dir nur, das du keine Rechtschreibfehler gemacht hast und mehr nicht!
Zum Programmieren gehört doch schon etwas mehr dazu. Das ist so als
ob du irgendweinen Schwachsinn in einen Brief schreibst und dann die
Rechschreibprüfung von Word drüberjagst. Dadurch wird der Brief auch
nicht besser. Nur die Wörter sind danach richtig. Ob da was an der
falschen Stelle oder mit totalen Sinnverdrehungen steht sagt dir das aber
auch nicht.

Hier kann ich Nomis mal voll verstehen. Mußte ich jetzt leider mal so
loslassen :(

Gruß
Dino
 
Ich werd mich vllt irgendwann mal wieder. Ich habe geraden nichts zu testen. Ich bin hier nicht erwünscht. Wo kann man seinen Account löschen?
 
HI Kani,

Blödsinn. Aber was glaubst Du wohl, wie ich mich hier als Anfänger quäle (und andere)?
Ein bisschen selbst probieren muss sein! Du hast ihn zu recht schon verärgert.


Gruss,

Michael
 
Hi Kani,

Ich bin hier nicht erwünscht. Wo kann man seinen Account löschen?
Trotzreaktionen helfen niemandem. Vor allem Dir nicht. Aber das wirst Du
spätestens in der Ausbildung und danach im Beruf selber erkennen. Einfach
mal was zusammenhacken und es einem anderen dann vorwerfen nutzt
keinem was. Du mußt Dir selber schon ein paar Gedanken machen was
der Prozessor da für dich ausführen soll und dazu gehört nun mal dazu
das Programm im Kopf durchzuarbeiten so wie es ein Prozessor oder
Computer auch machen würde. Dann kommst Du sehr schnell drauf, was
da nicht passen kann.

Man ist durch Windows leider absolut versaut. Einfach mal hier klicken und
da klicken und dann läuft das. Und wenn das nicht läuft dann klickt man
noch da und da und gut. Eben mal schnell schnell. So sieht es leider auch
draußen in den Netzwerken der Firmen aus. Was meinst Du wohl was ich
teilweise bei Kunden für einen Müll vorfinde. Da macht sich keiner
irgendwelche Gedanken. Da wird nur wild in der Gegend rumprobiert bis
es irgendwann funktioniert. Warum es dann funktioniert, darüber hat sich
auch keiner Gedanken gemacht. DAS ist das Problem !

Also mach DIR Gedanken was Dein Programm bezwecken soll und dann
mach DIR Gedanken wie man es umsetzen kann. Wenn Du Probleme hast
wird Dir mit Sicherheit jeder gerne helfen.
Aber einfach mal was vorwerfen
geht nicht. Und wenn dann einer motzt du hättest es nicht mal durch
den Compiler laufen lassen weil noch auf den ersten Blick ersichtliche
Schreibfehler drin sind dann einfach mal auf "Gnöbbsche dricke", die
Schreibfehler rausmachen und dann wieder vorwerfen (weil jetzt ist
ja 0 Errors/0 Warnings) hilft auch nicht weiter.

Zum Programmieren gehört auch, die Aufgabe die man sich gestellt hat in
logische Teile zu zerlegen, und weiter zerlegen und weiter zerlegen ...
bis man auf die Größe eines Befehls kommt. Da gehört auch ein wenig
Erfahrung dazu - sicherlich - aber der Großteil ist logisches und
systematisches durchdenken der Abläufe die man da umsetzen will.

Wie würdest Du deine Blumen gießen ? Ein Klick und die haben Wasser ? :confused:
Und wenn sie noch kein Wasser haben dann klickt man nochmal woanders.
Das wäre die Windows-Version.

- Also zuerst Gießkanne unter den Wasserhahn,
- dann Wasserhahn aufdrehen,
- wenn die Kanne voll ist (aha ein IF/THEN)
- Wasserhahn zudrehen
- Dann mit der Kanne zu den Blumen gehen
- Blume/Topf anvisieren
- Kanne kippen
...
..
.
usw ...

DAS meine ich mit Aufgabe logisch zerlegen.
Genau DAS mußt DU beim Programmieren lernen. Erfahrung bringt dabei
nur eine Beschleunigung der Vorgänge.

Also weitermachen! :D

Gruß
Dino
 
Ich werd mich vllt irgendwann mal wieder. Ich habe geraden nichts zu testen. Ich bin hier nicht erwünscht. Wo kann man seinen Account löschen?

Ach Kani. Ich wollt dich doch nicht herausekeln. Nimm dir Zeit einen Testaufbau zusammenzuschustern und poste die Programme eben erst dann, wenn sie funktionieren und du sie ausprobiert hast oder du wirklich Stundenlang(Tagelang) an einem Problem hängst.
 
Naja, in der Schule meinen viele Lehrer, dass man erst Theoretisch etwas machen soll. Das habe ich gemacht. Ja, ich muss erst nächste Woche oder so wenn ich Geld habe mal Taster bei Reichelt bestellen.

Code:
#include <avr/io.h>     //Damit er DDRA und PORTB usw kennt

int main (void)     //Hauptschleife, (void) = undefiniertes Ende
{
    //Ports schalten
    DDRA = 0b00000000;    //LEDs auf Eingang (Anode an VCC)
    PORTA = 0b11111111;    //Pullups aktiv. (=LEDs aus)
    
    DDRB = 0b00000000;        //Taster auf Eingang
    PORTB = 0b00000000;        //Pullups aus    Taster "aus"
    
    //Variablen definieren
    
    

    while(1)     //Hauptschleife (immer wahr)
    {
        if( ! (PINB & (1 << PB0) ))     //Wenn Taster an PB0 gedrückt.
        {
            PORTA &= ~(1 << PA0);    //LED an PA0 anschalten
        }
        if( ! (PINB & (1 << PB1) ))     //Wenn Taster an PB1 gedrückt
        {
            PORTA &=~(1 << PA1);     //LED an PA1 anschalten
        }
        if( ! (PINB & (1 << PB2) ))
        {
            PORTA &=~(1 << PA2);
        }
        if( ! (PINB & (1 << PB3) ))
        {
            PORTA &=~(1 << PA3);
        }
        if( ! (PINB & (1 << PB4) ))
        {
            PORTA &=~(1 << PA4);
        }
        if( ! (PINB & (1 << PB5) ))
        {
            PORTA &=~(1 << PA5);
        }
        if( ! (PINB & (1 << PB6) ))
        {
            PORTA &=~(1 << PA6);
        }
        if( ! (PINB & (1 << PB7) ))
        {
            PORTA &=~(1 << PA7);
        }
    }
return 0;
}

Ich habe mir schon gedanken gemacht, ich melde mich in 2 Wochen oder so nochmal, wenn ich Geld habe um bei Reichelt zu bestellen.
 
Hallo zusammen,

Du hättest es auch im Simulator ausprobieren können, der eignet sich für solche Bit-Spielereien an Ausgangsregistern recht gut.
kann ich bestätigen. Sol lange man keine Zeitschleifen oder irgendwelche
Interrupt-Ferkeleien oder andere fiesen Tricks einsetzt kann man einfache
Sachen mit dem Simulator ganz gut durchspielen. Für nen Anfänger ist das
auch empfehlenswert, da man hier auch die internen Abläufe in den
Registern sehen kann.

Gruß
Dino
 
Ich glaube ich habe Probleme bei dem verstehen der Register.

Also DDR verstehe ich: Ein/-Ausgang
PIN: Wenn DDR auf Eingang =>Pin: Ausgang an/-aus
PORT: Wenn DDR auf Ausgang => Ausgang an/-aus.
Wenn DDR auf Eingang => Pull-Ups aktivieren/-deaktvieren.

Dann frag ich mich wofür PIN da ist?
 
Hallo Kani,

über PIN liest du direkt den logischen Zustand des IO-Pins ein, wenn du ein Bit des PORT-Registers liest, dann liest du nicht den logischen Zustand am Pin des AVR, sondern den Ihnalt des Latches.

Definierst du zum Beispiel einen Pin als Eingangspin und aktivierst den Pullup-Widerstand,


CodeBox C

DDRB &= ~(1<<PB0); // Direction PB0: Eingang (Bit=0)
PORTB |= 1<<PB0; // Pullup-Widerstand aktivieren (Bit=1)


dann liest du über PORT eine "1", also die "1", die du zuvor reingeschrieben hast. Deaktivierst du den Pullup-Widerstand, liest du eine "0".

Nach einem Reset sind alle PortDirections auf Eingang geschaltet (DDRx=0) und alle Pullup-Widerstände deaktiviert (PORTx=0). Du musst also nach einem Reset nicht unbedingt extra Pins als Eingang definieren oder den Pullup ausschalten, verkehrt ist es natürlich nicht.

Gruß,
Dirk
 
Eingang, Ausgang, Datenrichtung

Hi Kani,

Ich glaube ich habe Probleme bei dem verstehen der Register.

Also DDR verstehe ich: Ein/-Ausgang
PIN: Wenn DDR auf Eingang =>Pin: Ausgang an/-aus
PORT: Wenn DDR auf Ausgang => Ausgang an/-aus.
Wenn DDR auf Eingang => Pull-Ups aktivieren/-deaktvieren.

Dann frag ich mich wofür PIN da ist?
das sehe ich auch so :) Der erste Schritt zur Besserung ist die Selbsterkenntnis.
(Oder irgendwie so in der Art ;) )

Dann will ich mal nicht so sein (GUT AUFPASSEN !!)

DDR => Data Direction Register
Mit der Betonung auf Direction (Richtung) !
Die Bits die Du da reinschreibst sagen dem Prozessor NUR ob er den
entsprechenden Pin auf Eingang oder Ausgang schalten soll. Er dreht
also sozusagen das Einbahnstraßenschild in die eine oder andere Richtung.
MEHR NICHT ! Damit hast Du noch kein einziges Bit an den Anschluß gelegt
oder von dort gelesen.

PIN => Port Input-Register
Wenn Du das Register ausliest, dann erfährst Du, welcher Pegel (High/Low)
am Anschluß des Prozessors anliegt.

PORT => Port Output-Register
Wenn Du da was reinschreibst, dann willst Du dem Anschluß was mitteilen.
Und zwar ...
1. Wenn der Anschluß mit dem DDR auf Ausgang geschaltet ist (mit 1 im DDR)
schaltest Du über PORT den Anschluß auf High oder Low.
2. Wenn der Anschluß mit dem DDR auf Eingang geschaltet ist (mit 0 im DDR)
schaltest Du über PORT den Pull-Up-Widerstand an (1) oder aus (0).

Sieh dir in den Datenblättern mal die Tabelle "Port Pin Configurations" im
Abschnitt "I/O Ports" - "Configuring the Pin" an. Da steht was passiert,
wenn man welches Bit auf 1 oder 0 setzt.

Aber so wie ich das einschätze wird das meine nächste FAQ werden :rolleyes:

Gruß
Dino
 
Wenn du wirklich nicht mit dem Simulator vom AVRStudio arbeiten willst oder einfach nur die Ergebnisse viel lieber in natura erleben willst, können wir in der Zeit, in der du auf Bauteile wartest, ein kleines Ausweichprogramm auf dem PC machen.
Was hältst du davon?
Das Visual C++ hast du doch schon installiert?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)