- fchao-Sinus-Wechselrichter AliExpress         
Seite 6 von 6 ErsteErste ... 456
Ergebnis 51 bis 60 von 60

Thema: C-Programm mit einfachen Funktionen für AT90S2313

  1. #51
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Anzeige

    Powerstation Test


    Nehme alles zurück

    überprüfe das ganze jetzt mit "bit_is_set"...

    Und es passt dann alles... \/

  2. #52
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Was du wahrscheinlich haben willst ist

    DDRD &= ~_BV (PD5); // PortD.5 auf Eingang
    oder
    DDRD = 0b00000000; // PortD auf Eingang

    Nach RESET sind zwar alle Ports aud Eingang, aber schaden tuts nicht.

    !!! PD5 ist ein Konstante (nähmlich 5)!

    Die Abfrage geht mit
    if (PIND & _BV(PD5)) // oder PIND & 0b00100000
    {
    ...
    }

    oder

    if (bit_is_set (PIND, PD5)) // oder bit_is_set (PIND, 5)
    {
    ...
    }
    Überleg dir auch warum hier nicht PORTD steht, sondern PIND.

  3. #53
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Zitat Zitat von SprinterSB

    if (bit_is_set (PIND, PD5)) // oder bit_is_set (PIND, 5)
    {
    ...
    }
    Genau so habe ich es gemacht...

    Hmmm, aber habe, wie du wahrscheinlich vermutest
    if(bit_is_set(PORTD, PD5))
    geschrieben...
    Na ja, habe es eben umgeändert...aber an der Funktion hat sich nichts geändert. Es tat auch mit dem PORTD...


    Zitat Zitat von SprinterSB
    Überleg dir auch warum hier nicht PORTD steht, sondern PIND.
    Ok...scheint mir, ich werde so eben geprüft

    Also, laut Tutorial, welches ich ja mittlerweile fast auswendig kenne fragt man mit PORTD den gesamten Register ab...und somit den Zustand des internen PullUp-Widerstandes...und nicht etwa den Zustand am Pin.

    Ok, jetzt kommts Das gilt doch, wenn es als Eingangsport definiert ist. Und da ich ja PD5 als Ausgang definiert habe...(mal ganz vorsichtig) dürfte es wohl nichts ausmachen...

    Wobei ich eins auf jeden Fall hinzufügen muss:
    Erare humanum est

  4. #54
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Aber warum aus Ausgang? bzw warum dann die if-Abfrage auf diesen Port? Du weisst ja, welchen Wert du liest, nähmlich den, den du in PORT reingeschrieben hast.
    Wenn du auf Taster bzw Zustandsänderung testen willst, dann musst du das Ding 1) als Eingang definieren und 2) PIN abfragen und nicht PORT. PIN steht hier nicht für 'pin' (von Nadel) sondern für Port INput.

  5. #55
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Es ist was wahres drann, wenn man sagt, dass Menschen keine helseherischen Fähigkeiten haben.

    Vielleicht hätte ich auch dazu schreiben sollen, was ich überhaupt machen möchte

    Also, ich habe zwei Zustände...sagen wir CH1 und CH2.
    Mit einem Taster, der gegen Masse geschaltet ist, wird zwischen den Zuständen umgeschaltet, und je nach dem, welcher Zustand aktiv ist, wird seriell am Rechner CH1_OK oder CH2_OK ausgegeben.

    Weiterhin kann ich seriell mit dem Rechner Befehle an den uC schicken.
    wenn ich schreibe <CH1> ist Zustand CH1 aktiv und ich bekomme die Rückmeldung CH1_OK. Analog für CH2...

    Jetzt wollte ich auch noch am PC sehen, welcher Zustand anliegt, wenn man die Spannungsversorgung einschaltet. Bzw. wollte ich mit einem Befehl vom PC aus sehen, welcher Zustand derzeit aktiv ist...ohne den Zustand ändern zu wollen.
    Also kommt ein Befehl mit <CH?> und je nach dem welcher aktiv ist, CH1_OK oder CH2_OK zurück.

    Warum die Überprüfung vom Ausgangsport PD5?
    PD5 ist im Zustand CH1 auf high gesetzt und im Zustand CH2 auf low.

    Das war es dann eigentlich auch schon...

    Ähm, jetzt nochmal um sicher zu gehen...
    Muss ich jetzt in der if-Anweisung PIND oder PORTD verwenden?

  6. #56
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Eine Frage zum reseten...

    im Datenblatt steht ja...
    An External Reset is generated by a low level on the RESET pin. Reset pulses longer
    than 50 ns will generate a reset, even if the clock is not running. Shorter pulses are not
    guaranteed to generate a reset. When the applied signal reaches the Reset Threshold
    Voltage (VRST) on its positive edge, the delay timer starts the MCU after the Time-out
    period tTOUT has expired.


    War ich falsch informiert? Ich dachte der Reset wird durch schalten des PIN1 (Reset) an Vcc (über einen 1k Wiederstand) hervorgerufen.
    Im Datenblatt heißt es ja gegen Masse...oder wie habe ich "low level" zu verstehen

  7. #57
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Wenn der Port auf Ausgang steht, kannst du aus PORT den Wert wieder zurücklesen. Diese wiederum entspriche dem Potental am Pad, falls du nicht irgend ne Sonderfunktion aktiviert hast.
    Bei Input nimmst du PIN. PIN sollte auch funktionieren bei Output, um den Wert wieder zurück zu lesen.
    Jedenfalls sollte dein Programm jetzt im else-Zweig landen mit PORTD = 0b11011111;
    Für Charakteristika der Ports und deren interne Verdrahtung ist das Handbuch erste und sehr gute Anlaufstelle, und zu den Port-Macros steht was in der avr-libc-Doku (im AVR-Verzeichnis unter ./doc/avr-libc, Abschnitt 5.1.
    Manchmal ist auch ein Blick in die Header erhellend, unter
    ./avr/include/avr/ioxxxx.h

  8. #58
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Zitat Zitat von SprinterSB
    ...falls du nicht irgend ne Sonderfunktion aktiviert hast.
    Iccccccccccccccchhhhhhhhhhhh und Sonderfunktionen... [-( weiß nicht mal wie man das schreibt

    ja, die *.h Dateien habe ich auch schon betrachtet...

    Ähm, darf ich eigentlich etwas zum UART fragen. Habe ja den Code von Kjion übernommen...

    const unsigned char *tx_buffer; //das ist die Variablendeklaration bzw. Pointer

    for (tx_buffer = ch1; *tx_buffer!= '\0'; tx_buffer++)
    {
    sending = *tx_buffer;
    while ( !( USR & (1<<UDRE)))
    ;
    UDR = sending; //Return "CH1_OK" to PC
    }


    tx_buffer wurde ja nur als Pointer deklariert, wie kann man dann in der for-Schleife es als Variable verwenden? Macht das dann der Compiler automatisch? Oder wird hier die Initialisierung des Zeigers vorgenommen?

    Nach dem while kommt ja eine Leeranweisung, ist diese unbedingt nötig?

  9. #59
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von funky78
    Zitat Zitat von SprinterSB
    ...falls du nicht irgend ne Sonderfunktion aktiviert hast.
    Iccccccccccccccchhhhhhhhhhhh und Sonderfunktionen... [-( weiß nicht mal wie man das schreibt
    Scherzkeks, du verwendest zu Beispiel den UART

    --------------------------------------------------

    In C gibt es Pointer Arithmetik. Auf Pointer kann man ganzzahlige Werte draufaddieren und abziehen. Dabei wird der Pointer um so viel weiter gezählt, wie die Größe des Typs, auf den er deklariert wurde:

    Beispiel:
    short wert;
    short *p;
    p = &wert; // & = Adressoperator, wenn als Prefix verwendet.
    // kurz: short *p = &wert;

    Mit p += 1 wird p um 2 (ein short ist 2 Byte lang) weitergezählt.
    In diesem Fall zeigt p allerdings auf einen undefinierten Speicherbereich.

    Man benutzt das gerne, um Arrays zu durchlaufen. Zum Dereferenzieren schreibt man ein * davor.
    p ist also ein Zeiger
    *p ist der Wert dessen, worauf er zeigt
    &p ist die Adresse von p, vom Typ short**, also Zeiger auf Zeiger auf short.
    Mit *p = 3 weist man wert den Wert 3 zu.

    Eigentlich sind Pointer in C fast normale Variablen, und man kann auch int und einen Pointer umwandeln:
    p = (short*) 100; ist ein Zeiger auf die Speicherzellen 100/101
    und mit *p=0 kann man diese beiden Speicherstellen löschen.

    Da stehts etwas besser erklärt:
    http://www.cl.uni-heidelberg.de/kurs...l/page023.html

    Edit:
    Nach dem while kommt ja eine Leeranweisung, ist diese unbedingt nötig?
    Ja, eine Leeranweisung ist notwendig. Zu while gehört genau ein Block, also
    while (bedingung)
    ;
    oder
    while (bedingung)
    {}

    Sonst wird dein C-Compiler das UDR = ..., das darauf folgt, als while-Block ausführen.

  10. #60
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von funky78
    Eine Frage zum reseten...

    im Datenblatt steht ja...
    An External Reset is generated by a low level on the RESET pin. Reset pulses longer
    than 50 ns will generate a reset, even if the clock is not running. Shorter pulses are not
    guaranteed to generate a reset. When the applied signal reaches the Reset Threshold
    Voltage (VRST) on its positive edge, the delay timer starts the MCU after the Time-out
    period tTOUT has expired.


    War ich falsch informiert? Ich dachte der Reset wird durch schalten des PIN1 (Reset) an Vcc (über einen 1k Wiederstand) hervorgerufen.
    Im Datenblatt heißt es ja gegen Masse...oder wie habe ich "low level" zu verstehen
    Der Reset bei den AVRs ist LOW-aktiv, an Reset hängt man üblicherweise nen Pullup nach Vcc, um ein unbeabsichtigtes resetten durch ein Spike auf der Resetleitung zu unterbinden.
    RESET hat auch einen internen Pullup, dessen Wert jedoch größer ist als die üblicherweise verwendeten 10k. Schwankt glaub so um die 50k. Das Handbuch ist schon korrekt.

Seite 6 von 6 ErsteErste ... 456

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad