- LiFePO4 Speicher Test         
Seite 9 von 9 ErsteErste ... 789
Ergebnis 81 bis 87 von 87

Thema: QlockTwo - Die zweite

  1. #81
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Zur Zeit gibts es nur Fortschritte in homöopathischen Dosen.

    Ich habe meine get_time-Funktionen erweitert um aus dem BCD-Code eine "normale" Zahl zu erzeugen:
    Code:
    unsigned char get_time_s() 
    { 
    	i2c_start_wait(DS1307+I2C_WRITE); 
    	i2c_write(0x00); 
    	i2c_stop(); 
    	i2c_start(DS1307+I2C_READ); 
    	time_s = i2c_readNak(); 
    	i2c_stop(); 
    	 
    	einer=time_s;
    	einer&= 0x0f;
    
    	zehner=time_s;
    	zehner=zehner>>4;
    	zehner&= 0x07;
    
    	time_s = einer+10*zehner;
    
    	return time_s;
    }
    Diese lässt sich auch auf dem LCD-Display ausgeben:
    Code:
    sprintf(buffer, "%i",time_s);
    lcd_puts(buffer);
    Allerdings kann ich damit keine Switch-Anweisung füttern. Bei
    Code:
    	switch(time_s)
    		{
    			case 0: 	COLUMN = (1<<C1);
    						ROW = ~(1<<R1);
    						break;
    			case 2: 	COLUMN = (1<<C2);
    						ROW = ~(1<<R1);
    						break;
    			case 4: 	COLUMN = (1<<C3);
    						ROW = ~(1<<R1);
    						break;
    			case 6: 	COLUMN = (1<<C4);
    						ROW = ~(1<<R1);
    						break;
    
    ......
    springt er immer in das case 0 -Ergebnis.

    Hier noch der komplette Code
    Code:
    //***Included Files**//
    
    #include 	"i2cmaster/i2cmaster.h"
    #include 	<util/delay.h>
    #include	<stdio.h>
    #include	<avr/io.h>
    #include 	<stdlib.h>
    
    //***Defines***//
    
    #define DS1307 	0xD0
    #define R1		PD0
    #define R2		PD1
    #define R3		PD3
    #define R4		PD4
    #define R5		PD2
    
    #define C1		PB0
    #define C2		PB1
    #define C3		PB2
    #define C4		PB3
    #define C5		PB4
    
    #define COLUMN	PORTB
    #define	ROW		PORTD
    
    unsigned char time_s;
    unsigned char time_m;
    unsigned char time_h;
    unsigned char zehner;
    unsigned char einer;
    
    int test;
    
    unsigned char buffer[10];
    
    //***Functions***//
    
    unsigned char set_clock(unsigned char reg, unsigned char val) 
    { 
    	if (i2c_start(DS1307+I2C_WRITE) != 0) return 1; 
    	i2c_write(reg); 
    	i2c_write(val); 
    	i2c_stop(); 
    	return 0; 
    }
    
    unsigned char get_time_s() 
    { 
    	i2c_start_wait(DS1307+I2C_WRITE); 
    	i2c_write(0x00); 
    	i2c_stop(); 
    	i2c_start(DS1307+I2C_READ); 
    	time_s = i2c_readNak(); 
    	i2c_stop(); 
    	 
    	einer=time_s;
    	einer&= 0x0f;
    
    	zehner=time_s;
    	zehner=zehner>>4;
    	zehner&= 0x07;
    
    	time_s = einer+10*zehner;
    
    	return time_s;
    }
    
    unsigned char get_time_m() 
    { 
    	i2c_start_wait(DS1307+I2C_WRITE); 
    	i2c_write(0x01); 
    	i2c_stop(); 
    	i2c_start(DS1307+I2C_READ); 
    	time_m = i2c_readNak(); 
    	i2c_stop();
    
    	einer=time_m;
    	einer&= 0x0f;
    
    	zehner=time_m;
    	zehner=zehner>>4;
    	zehner&= 0x07;
    
    	time_m = einer+10*zehner;
    
    	return time_m;
    }
    
    
    unsigned char get_time_h() 
    { 
    	i2c_start_wait(DS1307+I2C_WRITE); 
    	i2c_write(0x02); 
    	i2c_stop(); 
    	i2c_start(DS1307+I2C_READ); 
    	time_h = i2c_readNak(); 
    	i2c_stop();  
    
    	einer=time_h;
    	einer&= 0x0f;
    
    	zehner=time_h;
    	zehner=zehner>>4;
    	zehner&= 0x07;
    
    	time_h = einer+10*zehner;
    
    	return time_h;
    }
    
    //***Mainfunction***//
    int main (void)
    {
    
    //***Initilize I/O***//
    
    DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4);		// PB0 to PB4 as Output	(Columns)
    DDRD = (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4);		// PD0 to PD4 as Output	(Rows)
    
    //set_time(0x00, 0x17);
    //set_time(0x01, 0x24);
    //set_time(0x02, 0x20);
    	while (1)
    	{		
    	
    	get_time_s();
    //	get_time_m();
    
    	test = time_s;
    	switch(time_s)
    		{
    			case 0: 	COLUMN = (1<<C1);
    						ROW = ~(1<<R1);
    						break;
    			case 2: 	COLUMN = (1<<C2);
    						ROW = ~(1<<R1);
    						break;
    			case 4: 	COLUMN = (1<<C3);
    						ROW = ~(1<<R1);
    						break;
    			case 6: 	COLUMN = (1<<C4);
    						ROW = ~(1<<R1);
    						break;
    			case 8: 	COLUMN = (1<<C5);
    						ROW = ~(1<<R1);
    						break;
    			case 10: 	COLUMN = (1<<C1);
    						ROW = ~(1<<R2);
    						break;
    			case 12: 	COLUMN = (1<<C2);
    						ROW = ~(1<<R2);
    						break;
    			case 14: 	COLUMN = (1<<C3);
    						ROW = ~(1<<R2);
    						break;
    			case 16: 	COLUMN = (1<<C4);
    						ROW = ~(1<<R2);
    						break;
    			case 18: 	COLUMN = (1<<C5);
    						ROW = ~(1<<R2);
    						break;
    			case 20: 	COLUMN = (1<<C1);
    						ROW = ~(1<<R3);
    						break;
    			case 22: 	COLUMN = (1<<C2);
    						ROW = ~(1<<R3);
    						break;
    			case 24: 	COLUMN = (1<<C3);
    						ROW = ~(1<<R3);
    						break;
    			case 26: 	COLUMN = (1<<C4);
    						ROW = ~(1<<R3);
    						break;
    			case 28: 	COLUMN = (1<<C5);
    						ROW = ~(1<<R3);
    						break;
    			case 30: 	COLUMN = (1<<C1);
    						ROW = ~(1<<R4);
    						break;
    			case 32: 	COLUMN = (1<<C2);
    						ROW = ~(1<<R4);
    						break;
    			case 34: 	COLUMN = (1<<C3);
    						ROW = ~(1<<R4);
    						break;
    			case 36: 	COLUMN = (1<<C4);
    						ROW = ~(1<<R4);
    						break;
    			case 38: 	COLUMN = (1<<C5);
    						ROW = ~(1<<R4);
    						break;
    			case 40: 	COLUMN = (1<<C1);
    						ROW = ~(1<<R5);
    						break;
    			case 42: 	COLUMN = (1<<C2);
    						ROW = ~(1<<R5);
    						break;
    			case 44: 	COLUMN = (1<<C3);
    						ROW = ~(1<<R5);
    						break;
    			case 46: 	COLUMN = (1<<C4);
    						ROW = ~(1<<R5);
    						break;
    			case 48: 	COLUMN = (1<<C5);
    						ROW = ~(1<<R5);
    						break;
    			case 50: 	COLUMN = (1<<C1)|(1<<C2);
    						ROW = ~(1<<R1);
    						break;
    			case 52: 	COLUMN = (1<<C1)|(1<<C2);
    						ROW = ~(1<<R2);
    						break;
    			case 54: 	COLUMN = (1<<C1)|(1<<C2);
    						ROW = ~(1<<R3);
    						break;
    			case 56: 	COLUMN = (1<<C1)|(1<<C2);
    						ROW = ~(1<<R4);
    						break;
    			case 58: 	COLUMN = (1<<C1)|(1<<C2);
    						ROW = ~(1<<R5);
    						break;
    			case 60: 	COLUMN = (1<<C1)|(1<<C3);
    						ROW =  ~(1<<R1);
    						break;
    			case 255:	COLUMN = (1<<C1)|(1<<C3);
    						ROW =  ~(1<<R1)|~(1<<R5);
    						break;
    		}
    	}
    
    	return 0;
    }

  2. #82
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    So ganz werde ich aus dieser Technik nicht schlau

    Nachdem ich das Sekundenregister neu beschrieben habe läuft jetzt die Switchanweisung. Ich will Zahnräder, Federn und Seilzüge

  3. #83
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    T-T-T-T-T-T-Tripplepost!!!!

    Code:
    //***Included Files**//
    
    #include 	"i2cmaster/i2cmaster.h"
    #include 	<util/delay.h>
    #include	<stdio.h>
    #include	<avr/io.h>
    #include 	<stdlib.h>
    
    //***Defines***//
    
    #define DS1307 	0xD0
    #define R1		PD0
    #define R2		PD1
    #define R3		PD3
    #define R4		PD4
    #define R5		PD2
    
    #define C1		PB0
    #define C2		PB1
    #define C3		PB2
    #define C4		PB3
    #define C5		PB4
    
    #define COLUMN	PORTB
    #define	ROW		PORTD
    
    unsigned char time_s;
    unsigned char time_m;
    unsigned char time_h;
    unsigned char zehner;
    unsigned char einer;
    
    //***Mainfunction***//
    int main (void)
    {
    
    //***Initilize I/O***//
    
    		DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4);		// PB0 to PB4 as Output	(Columns)
    		DDRD = (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3)|(1<<PD4);		// PD0 to PD4 as Output	(Rows)
    
    	//set_clock(0x00, 0x00);
    	//set_clock(0x01, 0x24);
    	//set_clock(0x02, 0x20);
    
    	ROW = 0xff;
    	COLUMN = 0x00;
    	int i;
    	int reihe[5] =	{	~((1<<R1)|(0<<R2)|(0<<R3)|(0<<R4)|(1<<R5)),
    						~((0<<R1)|(1<<R2)|(0<<R3)|(1<<R4)|(0<<R5)),
    						~((0<<R1)|(0<<R2)|(1<<R3)|(0<<R4)|(0<<R5)),
    						~((0<<R1)|(1<<R2)|(0<<R3)|(1<<R4)|(0<<R5)),
    						~((1<<R1)|(0<<R2)|(0<<R3)|(0<<R4)|(1<<R5))};
    
    	int spalte[5] = {(1<<C1),(1<<C2),(1<<C3),(1<<C4),(1<<C5)};
    
    	while (1)
    	{
    			for(i=0; i<5; i++)
    			{
    				COLUMN = 0x00;
    				COLUMN = spalte[i];
    				ROW = reihe[i];
    			}
    	}
    
    	return 0;
    }

    Mit diesem Coder teste ich grad das Multiplexen. Die Idee ist ganz einfach:

    Da ich eine 5x5 Matrix habe kann ich Spalten und Reihen gleichzeitig hochzählen (for-Schleife).

    Mein Problem ist jetzt, dass nicht nur das diagonale Kreuz, welches angezeigt werden soll, leuchtet sondern noch die "umliegenden" LEDs. Also in etwas so:

    Code:
    11011
    11111
    01110
    11111
    11011
    Das lag zuerst daran, dass die Spalten aktualisiert aktualisiert wurde während die Reihen noch "die alten" sind. Darum habe ich mit der Zeile
    Code:
    COLUMN = 0x00;
    abgeschaltet. Der Vorgang war also:

    1. Spalte abschalten (damit ist die Matrix komplett aus)
    2. Reihe aktualisieren
    3. Spalte aktualisieren (Damit wird die Matrix wieder eingeschaltet)

    Aber das funktioniert auch nicht. Erst mit einem 1ms-Delay leuchtet nur das gewünschte diagonale Kreuz. Aber das Delay kostet wieder Helligkeit.

    Jemand ne Idee woher das Problem kommt und wie man es lösen kann?

  4. #84
    Neuer Benutzer Öfters hier
    Registriert seit
    10.08.2009
    Beiträge
    8
    Deine Code läuft einfach viel zu schnell durch, du musst ihn auf eine sinnvolle Geschwindigkeit bremsen.
    Sinnvoll ist da sowas im Bereich von 50-100 Durchläufen pro Sekunde.

    Das schreit nach einem Timer.
    Der Timer müsste dann für 100Hz Bildwiederholungsrate mit 5*100 Hz die nächste Spalte aufrufen.
    So bleibt denn die Spalte auch eine Zeit lang an und wird nicht sofort wieder abgeschaltet

  5. #85
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    Dass ein Code mal zu schnell laufen kann

    Zumindest hängt es nicht mit dem Code zusammen (bzw. nur indirekt). Ich hatte gedacht, dass die Transistoren vielleicht zu langsam sind. Ist natürlich Blödsinn. Bin im Datenblatt dann über die Spannungs- und Stromkurven gestolpert. Deute ich das richtig, dass das Nachglimmen der LEDs dadurch verursacht wird, dass der Transistor nicht sofort "abschaltet" sondern "langsam" hochohmig wird und so noch Reststrom die nachfolgenden LEDs erreicht? Mir fehlt das Fachvokabular, um das besser zu erklären

  6. #86
    Neuer Benutzer Öfters hier
    Registriert seit
    10.08.2009
    Beiträge
    8
    Wenn ich dich gerade richtig verstehe lag das ebenfalls daran, dass dein Code einfach mit Voller Geschwindigkeit durchgebrettert ist.
    Du hast ja die neuen Daten (eine Daten-Zeile) angelegt und dann erst die nächste Zeile aktiviert .
    Das ist an sich noch nicht schlimm, die Zeit in der die Daten an der falschen Spalte anliegen ist ja nicht lang. Aber dann hast du die Daten nicht ein Weile an der richtigen Zeile anliegen lassen sondern genauso schnell weitergeschaltet.
    In der Summe lagen die Daten also die gleiche Zeit lang an der richtigen, wie an der falschen (vorigen) Zeile an. Dadurch leuchten denn natürlich die falschen Zeilen genauso hell mit.

    Versuchs mal mit dem Timer. Das sollte die Probleme beheben. Zudem hast du dann zwischen der Aktualisierung der Zeilen immer massig Zeit andere Dinge zu tun (zb eine Uhrzeit zu aktualisieren, Snake laufen zu lassen usw)

  7. #87
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    39
    Beiträge
    557
    hmmm.. Snake.....

    Im aktuellen Programm wird die Matrix nur aktiviert (über die Spalten gesteuert) wenn in den Reihen die aktuellen Werte anliegen.

    Ich probiere das mit dem Timer mal aus wenn ich etwas mehr Zeit habe. Im Moment stecke ich voll im Prüfungsstress. Aber ein paar Zeilen werde ich Abends wohl noch zusammen kriegen um den Kopf wieder frei zu bekommen. Jetzt gehts aber erstmal weiter mit h-s-Diagrammen, Enthalpien, Entropien, Isochoren, Isokeineahnugnwasnoch...... Wärmetechnik eben

Seite 9 von 9 ErsteErste ... 789

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad