- Labornetzteil AliExpress         
Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 51

Thema: einige Fragen zu Grundlagen der C-Programmierung

  1. #11
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Anzeige

    Powerstation Test
    Ok, es reicht also aus, wenn ich "PINB" als eine Art System-Variable ansehe. Bei welchem Controller PINB welches Register ist, wird über diese Packages geklärt, nehm ich mal an.

    Schreibt printf() eigentlich auf dem AVR dann auf RS232 ? Mit welchem Programm kann ich auf meinem PC darstellen, was vom Controller kommt?

    Wo finde ich denn ne API für C? Ist C eigentlich oo? Bis jetzt hab ich nämlich noch keine Klassen gesehen. Wenn es Klassen gibt: Kann man dann Klassen auf dem AVR benutzen? (vieeele Fragennn...)

    mfg
    jagdfalke

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    -PINB ist ein Register das zum Port B gehört. Würdest Du Port A auslesen wollen, nimmst Du PINA. Welcher Port wo ist und welche Register dazu gehören, steht im Datenblatt.

    - es gibt zwar die Funktion printf im gcc, aber ich habe sie noch nicht benutzt und kann auch nicht sagen, was sie macht. Aber auf die serielle Schnittstelle schreibt sie afaik nicht. Man kann sich aber relativ einfach eine Funktion bauen, die genau das macht. Um die Daten auf dem PC darzustellen, nimmst Du am Anfang am besten das HyperTerminal. (Wenn Du unter Windows arbeitest...)

    - C ist nicht objektorientiert. Also gibt es auch keine Klassen...

    askazo

  3. #13
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Kannst du mir sagen wie ich mir so eine Funktion schreiben kann, die auf RS232 schreibt bauen kann? Dann hätte ich wenigstens schon mal einen kleinen Erfolg auf dem ich aufbauen könnte.
    mfg
    jagdfalke

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Sag doch bitte mal kurz, mit welchem Prozessor Du arbeitest. Dann könnte ich direkt ein paar Codeschnippsel liefern.
    Zudem solltest Du einen externen Quarz verwenden, da der interne Clock-Generator für eine RS232-Übertragung zu ungenau ist.

  5. #15
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Mein Prozessor ist der Atmega32. So ein Quarz ist da schon drauf. Kenn mich nicht wirklich gut aus mit den Sachen, wäre also nett, wenn du die Codeschnipsel gut auskommentieren könntest.

    Welches Programm kann ich unter Linux statt Hyperterminal benutzen? Geht telnet irgendwie?

    Danke
    jagdfalke

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Ich hab was in der Doku des RNBFRA gefunden:

    die wichtigsten Board-Adressen:

    RS232 TX: Port PD1
    RS232 RX: Port PD0
    Was ist nun wieder ein Port?
    Wie das in C verwendet wird kann man nicht rauslesen, da die Codebeispiele in Bascom geschreiben sind (zum schreiben print, zum lesen input)

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    So, ich habe mal ein kleines Programm geschrieben, das einfach einen einzelnen Buchstaben (in diesem Fall ein x) endlos auf der UART ausgibt.
    Hab leider gerade keine Zeit, da noch eine Funktion draus zu basteln, die einen ganzen String ausgibt, aber das sollte kein großes Problem mehr sein. Du musst noch Deine Taktfrequenz anpassen, ich habe jetzt einfach mal 8MHz angenommen.
    Ich bin jetzt auch davon ausgegangen, dass Du WinAVR benutzt. Solltest Du einen anderen Compiler verwenden, wird's nicht laufen...

    Code:
    #include <avr/io.h>
    #include <avr/sfr_defs.h>
    	
    	
    //Einige Makros zur Berechnung des Baud-Raten Registers
    #define F_CPU			8000000 // 8MHz Taktfrequenz
    #define BAUD_RATE		9600   // gewünschte Baud-Rate für UART
    #define BAUD_SELECT 	(F_CPU/(BAUD_RATE*16l)-1) //Berechnungsformel für das Baud-Raten Register
    	
    //Diese Funktion sendet ein einzelnes Zeichen an die UART	
    void uart_putchar(char c)
    {   
    	//warte, bis das Bit UDRE im Register UCSRA gesetzt ist. 	
    	//Dieses Bit wird vom Prozessor gesetzt, wenn das Senderegister leer ist
    	loop_until_bit_is_set(UCSRA, UDRE);
    	//Übergebenes Zeichen ins Senderegister UDR legen.
    	//Die Daten werden jetzt an die UART geschickt.
    	UDR = c;	
    }
    
    
    int main (void)
    {
    	//Zuerst muss die UART initialisiert werden
    	
    	//Hier wird der Sender der UART aktiviert. 
    	//Der Empfänger und die Interrupts bleiben in diesem Beispiel aus
    	UCSRB = 0x08;
    	
    	//Jetzt muss noch die Baudrate eingestellt werden.
    	//Wir weisen dem Register einfach das Makro von oben zu.
    	UBRRL = BAUD_SELECT;
    	
    	//Jetzt kommt die Hauptschleife
    	//Es wird immer das gleiche Zeichen (x) an die UART ausgegeben
    	while(1)
    	{
    		uart_putchar('x');
    	}
    	return 1;
    }
    Gruß,
    askazo

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Also das kapier ich noch nicht ganz:
    wo kommt die methode loop_until_bit_is_set her? Heißt das, dass Bits nicht immer gesetzt werden, wenn man dem Controller das sagt? Das würde ja allen Grundlagen der Logik widersprechen.

    Woher weiß du, wie die ganzen Register heißen? z.B. UCSRB kommt in meine Doku nich einmal vor. (Wer sie sich anschaun möchte: http://www.robotikhardware.de/downlo...urnbfra1.2.pdf )

    Und was bedeutet z.B. 0x03 ?? Im AVR-GCC Tut steh es das mit 0 und 1 auf 1 und den Rest auf 0. Hä? Wo soll man das denn aus 0x03 rauslesen?

    Warum funktioniert der Code nur mit WinAVR?

    mfg
    jagdfalke

  9. #19
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236

    Also das kapier ich noch nicht ganz:
    wo kommt die methode loop_until_bit_is_set her? Heißt das, dass Bits nicht immer gesetzt werden, wenn man dem Controller das sagt? Das würde ja allen Grundlagen der Logik widersprechen
    lese mal hier
    //warte, bis das Bit UDRE im Register UCSRA gesetzt ist.
    //Dieses Bit wird vom Prozessor gesetzt, wenn das Senderegister leer ist
    Warum widerspricht das der Logik?

    Wenn das Senderegister noch nicht leer ist, darf man wohl nichts reinschreiben, sondern man muß auf ein Signal,Flag warten, daß es weitergehen darf, ist das logisch?

    Und damit hat das Register UCSRA was zu tun, Lese mal die Dattenblätter zu Deinem AVR.
    Woher weiß du, wie die ganzen Register heißen?
    Lese Dattenblätter
    UCSRB kommt in meine Doku nich einmal vor
    ATMega32.pdf, Seite 159

    [quote]
    Und was bedeutet z.B. 0x03[/qoote]

    0x03 Hex bedeutet 3 Dezi und "000000"11 Binär.
    Warum funktioniert der Code nur mit WinAVR?
    ???

    Gruß Sebastian

  10. #20
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Ok, jetzt vestehe ich das einigermaßen. Danke !
    Doku ungleich Doku, aha ! Aber woher hast du Atmega32.pdf ? Ich hab das gar nicht.

    Ich bin jetzt auch davon ausgegangen, dass Du WinAVR benutzt. Solltest Du einen anderen Compiler verwenden, wird's nicht laufen...
    Das war mit "Warum funktioniert der Code nur mit WinAVR?" gemeint.

    Vielen Danke für deine / eure Geduld!

    mfg
    jagdfalke

Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test