Hallo zusammen, ich habe einen Atmega48 und möchte den PORT C als Ausgang nutzen. Jedoch messe ich bei den Ausgängen nur sehr geringe Spannungen. PORTC0= 2,8V PORTC1= 1,7V PORTC2= 2,8V PORTC3= 5,0V //so sollte es sein. Ich versuche mit jedem Ausgang einen Transistor zu schalten, welche mir ein Relais durchschalten. Leider funktioniert es nur bei PC3 und PC2. Es gibt kein JTAG Fuse zum ausschalten, AREF ist nicht mit VCC verbunden. Habe mich gefühlt schon durch das halbe Internet und durch das Datenblatt gewühlt, ich komme einfach nicht drauf. Hier ist mein Code, ich hoffe jemand kommt auf den Trichter und könnte mir einen kleinen Tipp geben. /*-------------- SPI definieren---------*/ #define F_CPU 8000000UL #define SPI_DDR DDRB #define SPI_PORT PORTB #define SPI_MOSI PB3 #define SPI_MISO PB4 #define SPI_SCK PB5 // Inputs definition #define HS_MITTE (PIND & (1<<PD0)) //Eingang um Handschalter Mitte auszulesen. #define HS_M1_AB (PIND & (1<<PD1)) //Eingang um Handschalter M1 Ab auszulesen. #define HS_M2_AB (PIND & (1<<PD2)) //Eingang um Handschalter M2 Ab auszulesen. #define HS_M1_AUF (PIND & (1<<PD4)) //Eingang um Handschalter M1 Auf auszulesen. #define HS_M2_AUF (PIND & (1<<PD3)) //Eingang um Handschalter M2 Auf auszulesen. #define ES_M1_MITTE (PINC & (1<<PC4)) //Eingang um Endschalter M1 Mitte auszulesen. #define ES_M2_MITTE (PINC & (1<<PC5)) //Eingang um Endschatler M2 Mitte auszulesen. // Outputs definition #define M1_AUF_AN PORTC |= (1<<PC0) //Motor 1 up on. #define M1_AB_AN PORTC |= (1<<PC1) //Motor 1 down on. #define M2_AUF_AN PORTC |= (1<<PC2) //Motor 2 up on. #define M2_AB_AN PORTC |= (1<<PC3) //Motor 2 down on. #define M1_AUF_AUS PORTC &= ~(1<<PC0) //Motor 1 up off. #define M1_AB_AUS PORTC &= ~(1<<PC1) //Motor 1 down off. #define M2_AUF_AUS PORTC &= ~(1<<PC2) //Motor 2 up off. #define M2_AB_AUS PORTC &= ~(1<<PC3) //Motor 2 down off. // Includes #include <avr/io.h> //Header Controller defs. auswahl über makefile void init(void); int main() { init(); while(1) { if(HS_M1_AUF) { M1_AUF_AN; } if(HS_M1_AB) { M1_AB_AN; } if(HS_M2_AUF) { M2_AUF_AN; } if(HS_M2_AB) { M2_AB_AN; } else { M1_AB_AUS; M1_AUF_AUS; M2_AB_AUS; M2_AUF_AUS; } } return 0; } void init(void) { // INPUTS DDRD &= ~(1<<PD0); //HS_MITTE DDRD &= ~(1<<PD1); //HS_M1_AB DDRD &= ~(1<<PD2); //HS_M2_AB DDRD &= ~(1<<PD3); //HS_M2_AUF DDRD &= ~(1<<PD4); //HS_M1_AUF DDRC &= ~(1<<PC4); //ES_M1_MITTE (Endschalter M1 Mitte) DDRC &= ~(1<<PC5); //ES_M2_MITTE (Endschalter M2 Mitte) // OUTPUTS DDRC |= (1<<PC0); //SIG_M1_AUF DDRC |= (1<<PC1); //SIG_M1_AB DDRC |= (1<<PC2); //SIG_M2_AUF DDRC |= (1<<PC3); //SIG_M2_AB }
Hm. Könnte es sein, dass der else-Fall bei Deiner Messung eintritt?
1 | if(HS_M2_AB) |
2 | {
|
3 | M2_AB_AN; |
4 | }
|
5 | else
|
6 | {
|
7 | M1_AB_AUS; |
8 | M1_AUF_AUS; |
9 | M2_AB_AUS; |
10 | M2_AUF_AUS; |
11 | }
|
Ich stelle die These auf, dass Du nicht wirklich willst, dass alle Ausgänge auf Low gehen falls alleine HS_M2_AB auf Low steht. Magst Du das mal überprüfen? Das heisst nämlich auch, dass, selbst falls einer der Ausgänge in den vorhigen Code-Zeilen auf High gesetzt wird, er nur sehr kurz auf High bleibt, falls HS_M2_AB auf Low steht. Ist das wirklich so gewollt? Vielleicht auch mal den Schaltplan posten.
VCC mit AVCC verbunden? Wo sagst du dem DDRC Register das die Port 0-3 Ausgang sind?
Die Else-Schleife wars... Dankeschön! Hab einfach zu quer gedacht und den einfachen Fehler nicht gesehen.
Thomas R. schrieb: > Die Else-Schleife wars ARG ... immer wieder gerne geschrieben und deswegen die Leute auseinander genommen.
Thomas R. schrieb: > Die Else-Schleife wars... Else-Schleifen gibt es nicht! ... in allen gängigen C-Dialekten jedenfalls ....
Korinthen Kacker schrieb: > Thomas R. schrieb: >> Die Else-Schleife wars... > > Else-Schleifen gibt es nicht! > > ... in allen gängigen C-Dialekten jedenfalls .... Es gibt keine if-Schleifen!
Korinthen Kacker schrieb: > Else-Schleifen gibt es nicht! Doch! Meine Else hat eine schöne Schleife; ich kenne aber keine IF-Schleife.
Norbert S. schrieb: > http://www.if-schleife.de/ Themaverfehlung! Der TO berichtete ausdrücklich dass Thomas R. schrieb: > Die Else-Schleife wars... und nicht eine If-Schleife!
Oh, dann nehme ich die 6 hin und setze mich. Am besten auf die Hände...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.