- 3D-Druck Einstieg und Tipps         
Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 60

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

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

    Powerstation Test
    Zitat Zitat von izaseba
    das Problem ist nur, bin wirklich ein Anfänger, was Programmieren allg. angeht...
    Ich will Dich nicht gerade, hmmm angreifen, aber Du kannst mir nicht erzählen, daß man von Euch Sachen verlangt, die Ihr nicht durchgearbeitet habt ?

    Wie kann ich Dir sonst noch helfen? was verstehst Du nicht?

    Gruß Sebastian

    EDIT: Mit dem Beispiel von Kjion hast Du schon das halbe Programm fertig.
    Fühle mich auch nicht angegriffen...
    Wie kann man von uns Sachen verlangen, die wir nicht durchgearbeitet haben.
    Diese Arbeit war eine reine Hardwarearbeit...
    Mein Betreuer meinte, ich solle die Hardwaretechnischen Probleme lösen, und er wird dann die Software, sprich den Mikrocontroller programmieren.
    Na ja, nun meinte er eben, dass er keine Zeit hat, und ich mich mal etwas damit beschäftigen soll.
    Zuvor habe ich nie etwas mit Mikrocontroller zu tun gehabt (bin doch eher der Hardwaremensch). Programmieren musste ich im zweiten Semester, wo es hieß, wir müssen die Sprach der Zukunft lernen, nämlich Oberon...
    Das Institut hat damals darauf geschwört...und kein Jahr später sind sie selbst zu JAVA umgestiegen...

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Na ja, wie gesagt, das Beispiel von Kjion ist die halbe Miete, wobei der µC damit Beschäftigt ist auf die ankommenden Zeichen zu warten.
    Eleganter ist es einen Interrupt auszulösen, wenn ein Zeichen gekommen ist.
    erstelle Dir ein Puffer volatile unsigned char puffer[10], eine hilfsvariable volatile unsigned char zaehler, lass das Zeichen das sich in UDR befindet nach zeilenvorschub prüfen ASCII Code 13 bzw. 0x0D, wenn TRUE dann hängst Du noch ein '\0' an dein Puffer hintendran setzt Dein zaehler auf 0 und vergleichst den Puffer mit Konstanten wie CH1 oder wie auch immer.

    Wenn kein Zeilenvorschub im UDR drin ist schreib Dir das zeichen in das Array an der zaehler Stelle, erhöhe den zaehler um 1, und verlasse den Interrupt.

    Worauf man aber achten sollte ist daß der Puffer nicht überläuft, das dürfte aber kein großes Problem werden.

    Versuch einfach irgendwas zu schreiben, und wenn es nicht klappt poste Dein Programm hier rein, es wird Dir sicher jemand helfen können.

    Gruß Sebastian

    P.S. Solte ich irgendwas falsches von mir gegeben haben, möge man mich darauf hinweisen.

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Günstiger ist es, nen Ringpuffer zu verwenden und nicht den ganzen Puffer volatile zu machen.
    Der obige ansatz fürt zu sporadischen Fehlern wenn der Interrupt zu ungünstiger Zeit auftritt.

    Wenn ein Teil schreibt (Zb die Interrupt Service Routine) und im Hauptprogram gelesen wird, dann funktioniert folgendes. Ist eher ein Vorschlag als ne copy-and-paste-Lösung. Fehlerbahandlunf bei vollem Puffer fehlt noch.

    Im Header:
    Code:
    extern byte rbuf_get();
    extern void rbuf_put(byte data);
    extern volatile byte rbuf_count;
    Im C-File:
    Code:
    #define RBUF_SIZE 70
    
    static byte rbuf[RBUF_SIZE] __attribute__ ((section (".noinit")));
    
    volatile byte rbuf_count = 0;
    byte *rbuf_read = rbuf;
    byte *rbuf_write = rbuf;
    
    byte rbuf_get()
    {
    	while (0 == rbuf_count)
    		;
    		
    	byte *rd = rbuf_read;
    	byte data = *(rd++);
    	
    	if (rd == rbuf+RBUF_SIZE)
    		rd = rbuf;
    	
    	rbuf_read = rd;
    	
    	rbuf_count--;
    	
    	return data;
    }
    
    void rbuf_put(byte data)
    {
    	byte *wrt = rbuf_write;
    	
    	*(wrt++) = data;
    	
    	if (wrt == rbuf+RBUF_SIZE)
    		wrt = rbuf;
    	
    	rbuf_write = wrt;
    	
    	rbuf_count++;
    }
    byte ist bei mit ein unsigned char

  4. #14
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Der obige ansatz fürt zu sporadischen Fehlern wenn der Interrupt zu ungünstiger Zeit auftritt.
    Das stimmt, um das zu vermeiden mache ich es so:
    Wenn 0x0D empfangen wurde, schalte ich RXCIE ab, und setze noch in der SIG_UART_RECV irgendein Bit auf 1 (ich definiere mir immer eine uint8_t Variable als Volatile, dann habe ich 8 Flags zu Verfügung.)
    in der main funktion wird der Flag dauernd abgefragt, und falls 1, wird verglichen.
    Danach, wenn Vergleich abgearbeitet ist wird der Flag gelöscht und RXCIE wieder eingeschaltet.
    Es ist vielleicht nicht super optimal, es fiel mir aber dazu nichts besseres ein, als ich mich damit seinerzeit beschäftigt habe.
    Deine Beispiele werde ich mir mal in RUHE mal angucken, danke.
    Ich hätte da auch ein Beispiel gepostet, aber funky will ja auch was lernen.

    Gruß Sebastian

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Zitat Zitat von izaseba
    Mit dem Beispiel von Kjion hast Du schon das halbe Programm fertig.
    Ich mal kurz den Rest dazu geschrieben, ganz ohne Ringpuffer oder sonstiges

    http://www.kreatives-chaos.com/code/2313_uart.c
    und das Makefile dazu:
    http://www.kreatives-chaos.com/code/Makefile

    Habs auch gerade mit einem ATMega8 geteset und sollte soweit funktionieren.

    @SprinterSB
    Ringpuffer sind ja ganz cool, aber in dem Beispiel doch ein wenig übertrieben, oder ??

    MfG Kjion

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von Kjion
    Ringpuffer sind ja ganz cool, aber in dem Beispiel doch ein wenig übertrieben, oder ??
    Wieso übertrieben?
    Was nutzt mir schlanker oder schneller Code wenn er nicht korrekt ist... Zudem frisst der Code nicht wirklich Platz.
    Ich hatte meine UART Routinen eben mit FiFo konzipiert, ist ja nicht so ungewöhnlich. AUsserdem trennt das meine Applikation von den UART-Routinen. Die UART-Routinen müssen nicht wissen, was da denn ankommt.

    Zitat Zitat von izaseba
    ich definiere mir immer eine uint8_t Variable als Volatile, dann habe ich 8 Flags zu Verfügung.
    Mach ich ähnlich, allerdings mit einem globalen Register. Hat den Vorteil, daß Schreib-und Leseoperationen darauf atomar sind, also ein Interrupt zwischen Lesen und Schreiben beim Verändern nicht zwischenfunken kann
    Register haben die AVRs ja genug.

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Zitat Zitat von Kjion
    Zitat Zitat von izaseba
    Mit dem Beispiel von Kjion hast Du schon das halbe Programm fertig.
    Ich mal kurz den Rest dazu geschrieben, ganz ohne Ringpuffer oder sonstiges

    http://www.kreatives-chaos.com/code/2313_uart.c
    und das Makefile dazu:
    http://www.kreatives-chaos.com/code/Makefile

    Habs auch gerade mit einem ATMega8 geteset und sollte soweit funktionieren.

    @SprinterSB
    Ringpuffer sind ja ganz cool, aber in dem Beispiel doch ein wenig übertrieben, oder ??

    MfG Kjion

    Guten Morgen...

    Also das sieht ja echt sehr gut aus...Vielen Dank.

    Ich habe gestern Nacht die Nachricht von izaseba mir ans Herz gelegt und angefangen irgendwie irgendwelche Buffer zu erstellen.

    Ich schaue mir mal eben dieses Beispiel an...vielleicht stelle ich mich ja diesmal nicht so dumm an, und es funktioniert...

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Ich weiß nicht, wie ich euch danken soll...

    Vielen vielen Dank... mir kommen gleich die Tränen...

    Es funktioniert...

    Habe es so umgesetze, wie Kjion beschrieben...

    Danke...

    Später hätte ich vielleicht noch einige Verständnisfragen...

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Da bin ich wieder...

    Wie gesagt, hat fast alles (Empfangen) bestens geklappt, nun stehe ich aber wieder vor einem Problem:

    die Umschaltbefehle sollen in Klammer geschrieben werden.

    statt CH1 soll <CH1> stehen...
    bzw. statt CH2...<CH2>...

    Das "Kleiner Zeichen" kann ich analog einlesen. Probleme habe ich beim "Größer Zeichen", weil ja davor die 1 oder je nach dem die 2 empfangen wird.

    Ich habe versucht es in zwei switch-Anweisungen zu machen...
    D.h. eine Empfängt <CH1> die andere <CH2>. Das Problem war dann, dass es nicht wiederholt werden konnte. Also einmal umschalten, und es war alles vorbei...

    Was mache ich nun?

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Zitat Zitat von funky78
    Was mache ich nun?
    Poste dein Programm damit man sehen kann was nicht stimmt

    MfG Kjion

Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress