- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 31 bis 40 von 60

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

  1. #31
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von funky78
    Ist es nicht möglich, einen string in Form eines Arrays zu definieren und das dann mit UDR auszugeben?

    char ch1[7] = "CH1_OK\n"

    und dann an der nötigen Stelle es auf zu rufen...

    UDR = ch1;
    Zum einen gibt dir ch1 nur die Anfangsadresse des Strings (ist ein char*).
    Die einzelnen Zeichen bekommst du mit
    ch1[0], ch1[1], etc

    Zudem ist dein String nicht 7, sondern 8 Zeichen lang!!! Da wird immer noch ne abschliessende '\0' als Stringende mit abgelegt.

  2. #32
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Zitat Zitat von SprinterSB
    Zitat Zitat von funky78
    Ist es nicht möglich, einen string in Form eines Arrays zu definieren und das dann mit UDR auszugeben?

    char ch1[7] = "CH1_OK\n"

    und dann an der nötigen Stelle es auf zu rufen...

    UDR = ch1;
    Zum einen gibt dir ch1 nur die Anfangsadresse des Strings (ist ein char*).
    Die einzelnen Zeichen bekommst du mit
    ch1[0], ch1[1], etc

    Zudem ist dein String nicht 7, sondern 8 Zeichen lang!!! Da wird immer noch ne abschliessende '\0' als Stringende mit abgelegt.
    Ok, danke...

    Einzelne Buchstaben lassen sich nun ausgeben (z.B. mit ch1[2])...
    Aber leider schaffe ich es noch nicht, dass er mir den gesamten String ausgibt...werde mal bisschen rum experementieren.

  3. #33
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Für mehrere gehts in ner Schleife
    Code:
    ...
    	const char * pc;
    	
    	for (pc = ch1; *pc != '\0'; pc++)
    	{
    		char zeichen = *pc;
    		// zeichen ausgeben
    	}
    ...

  4. #34
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32


    Ich glaube, ich bin wirklich zu doof...

    Ich setze mal den Codeteil rein...

    Code:
    char ch1[9] = "CH1_OK\n";
    char ch2[9] = "CH2_OK\n";
    const char *pc;
    char zeichen;
    
    ...
    
    for (pc = ch1; *pc!= '\0';pc++)
    zeichen = *pc;
    UDR = zeichen;
    
    ...
    Was er mir ausgibt ist...
    neue Zeile...

    Was mache ich falsch?

    Entschuldigt bitte, wenn ich nerve...

  5. #35
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Wie wär's mit {} um den Block in der for-Schleife?
    Die sind nicht nur Deko
    Und jedes Zeichen *übertragen*, nicht einfach alles in UDR reinrußen...warte bis der Puffer wieder leer ist.
    Wie der UART arbeitet, steht auch vorzüglich im Manual beschrieben.

  6. #36
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    Code:
    const prog_char *pc;
    
    for (pc = ch1; *pc!= '\0';pc++) {
    zeichen = *pc;
    // Warten bis der Sendepuffer frei ist
    while ( !( USR & (1<<UDRE)) )
       ;
    UDR = zeichen;
    }

  7. #37
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32


    Kjion...SprinterSB...

    Tausend dank...mir fehlen wirklich die Worte...vielen vielen Dank...

    Wenn der Code mal da steht, ist es einleuchtend...aber ganz ohne Code leuchtet bei mir leider nicht viel

  8. #38
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Hallo...

    habe ein Problem mit meiner Interruptroutine.

    An PD3 hatte ich zuvor einen Schalter gegen Masse. Diesen habe ich nun durch einen Taster ersetzt, was mir dann Probleme bereitete.

    Vielleicht sollte ich schreiben, was ich machen wollte.

    Drücke ich den Taster soll der Zustand 1 aktiviert werden. Drücke ich ihn nochmal, soll der Zustand 2 aktiviert werden.
    Das läuft auch soweit recht gut.
    Das Problem ist, dass der Taster prellt...die Zustände ändern sich. Habe bereits einen Kondensator und einen Wiederstand zur Entprellung eingelötet. Ist besser geworden, aber das Problem gibt es zwischen durch immer wieder.

    Als der Schalter drin war, konnte ich den Zustand abfragen, entweder war er High oder Low, und dann eine simple Warteschleife (zur Entprellung) einbauen. Aber beim Taster geht das doch nicht so einfach (bzw. kriege ich es nicht hin), weil ja jedes mal mit dem Zustand Low geschaltet wird, und der Taster leider auch beim loslassen prellt.

    Wie kann ich dieses Problem lösen? Bin über jeden Hinweis dankbar...

    Ich füge eben auch mal den Code ein...

    Code:
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    
    unsigned int status_taster=1;	// Status beim Eintritt in Interruptroutine
    
    void Inter();					// Interrupt funktion
    
    int main()
    {
    	DDRB = 0b11111111;			// PORTB als Ausgang definieren
    	PORTB = 0b00011000;			// PORTB setzen
    	
    	DDRD = 0b11110110;			// PD0 und PD3 als Eingang definieren
    	PORTD = 0b11111111;
    	
    	Inter();					
    	
    	for (;;)
    	{}
    	
    }
    
    void Inter()
    {
    	MCUCR = 0b00001000;			// Flanke definieren
    	GIMSK = 0b10000000;			// Enable interrupt
    	
    	sei();						// Interrupt freigeben
    }
    
    
    SIGNAL(SIG_INTERRUPT1)			// Taster an PD3 löst Interrupt aus
    {
    
    	if(status_taster==1)
    	{
    	
    			PORTB |= (1<<PB3);			/*Setzt PB3 HIGH...LED aus	\			*/	
    			PORTB &= ~(1<<PB4); 		//Setzt PB4 LOW...LED an	 } Zustand 1
    			PORTD |= (1<<PD5);			//Setzt PD5 HIGH			/
    
    			status_taster=2;
    	}
    	
    	else
    	{
    			PORTB &= ~(1<<PB3);		/*Setzt PB3 LOW...LED an	\			*/
    			PORTB |= (1<<PB4); 		//Setzt PB4 HIGH...LED aus	 } Zustand 2
    			PORTD &= ~(1<<PD5);		//Setzt PD5 LOW				/
    
    			status_taster=1;
    	}
    	
    	GIFR=0;
    }
    [-o<

  9. #39

  10. #40
    Benutzer Stammmitglied
    Registriert seit
    07.07.2005
    Beiträge
    32
    Zitat Zitat von Kjion
    Hi,


    http://www.mikrocontroller.net/forum/read-4-20549.html

    Das sollte dir weiterhelfen

    MfG Kjion
    Hallo nochmals...

    Habe mir mal alles ausgedruckt und in Ruhe angeschaut...
    Den kürzesten Code wollte ich dann auch verstehen...was mir wohl nicht besonders gelungen ist.

    Wo muss ich diesen Code unterbringen?
    In die Interruptroutine oder als eigene Funktion hinstellen?
    Wenn nicht Interruptroutine, woher weiß dann der uC das dieser zum Interrupt mit dem Taster gehört?
    Der Taster wird doch nicht abgefragt, oder?

    #pragma cd pl (9999) ....hmmm, was das wohl zu bedeuten hat...
    #include <reg51.h> .... da müsste wohl bei mir was anders stehen...
    void to_int(void) interrupt INT_T0...ich denke, mit der Zeile wird irgendwie der Bezug zur Interruptroutine gemacht.

    In den ganzen Artikeln zur Entprellung war stets eine Rede von Timer...dieser ist doch nicht in diesem Code, oder?

    Vielleicht sollte ich das ganze doch wirklich aufgeben...oder ich sitze nun wirklich zu lange vor meinem PC und sehe den Wald vor Bäumen nicht mehr...


Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test