- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 29

Thema: Programm probleme

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199

    Programm probleme

    Anzeige

    Powerstation Test
    Moin!!!

    Ich hab mir grade ein kleines Programm ausgedacht. Einzelne LEDs leuchten lassen funktioniert. Hab WinAVR und so endlich zum laufen bekommen.
    Kann mir jemand sagen, was hier falsch ist? Das is echt alles voll kompliziert.

    Hier das programm:

    #include <avr/io.h>
    #include <stdint.h>

    int main (void) {

    uint8_t portd; //Per int wird portd hoffentlich als Variable deklariert
    portd = PIND; //portd soll immer den Zustand der Pins annehmen

    DDRA = 0xff; //Das bedeutet das Port B komplett als Ausgang deklariert ist, denk ich
    DDRD = 0x00; //Das bedeutet das Port D komplett als Eingang deklariert ist, denk ich

    if (portd==1) //Wenn PortD 1 ist, also PD0 ein Signal "+5V" bekommt soll der komplette Porta
    {
    PORTA = 0x00; //auf 0V steuern
    }

    else
    PORTA = 0xff; //wenn PortD nicht 1 ist sollen die pins des PortA 5V haben

    while(1) {;}

    return 0;
    }


    MfG Jan

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    47
    Beiträge
    685
    Moin,

    da kann ich hoffentlich auch mal helfen :

    erstens sollte die Routine in der While(1) -Schleife stehen, sonst wird's nur einmal ausgeführt und danach nie wieder.
    Also quasi
    Code:
    int main(void){
     while (1){
      // das hier die ganze zeit wiederholen
     }
    }
    außerdem ist

    uint8_t portd; //Per int wird portd hoffentlich als Variable deklariert
    portd = PIND; //portd soll immer den Zustand der Pins annehmen

    irgendwie seltsam, da würde ich doch direkt PIND nehmen, um den Zustand der Eingangspins auszulesen.

    Also z.B. so:
    Code:
    #include <avr/io.h> 
    #include <stdint.h> 
    
    int main (void) { 
    
     //einmalig die Ports festlegen
    
     DDRA = 0xff; //Das bedeutet das Port B komplett als Ausgang deklariert ist, denk ich 
     DDRD = 0x00; //Das bedeutet das Port D komplett als Eingang deklariert ist, denk ich 
    
     while (1) {
    
      // die folgende Abfrage funktioniert nur, wenn nur an PD0 high anliegt und an allen anderen low!! ich würd's so machen
      // if ((PIND&(1<<0) !=0) ,damit ist der Zustand der anderen Pins egal
    
      if (PIND==1) //Wenn PortD 1 ist, also PD0 ein Signal "+5V" bekommt soll der komplette Porta 
      { 
       PORTA = 0x00; //auf 0V steuern 
      } 
     else 
     PORTA = 0xff; //wenn PortD nicht 1 ist sollen die pins des PortA 5V haben 
    } //ende der While-schleife
    
    return 0; 
    }
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    Das versteh ich nicht:
    if ((PIND&(1<<0) !=0) ,damit ist der Zustand der anderen Pins egal

    Ich kenne daran nur eine UNGLEICH verknüpfung wieder !=
    Sonst kenn ich nur kleiner als, größer als, kleinergleich etc.
    Dann kenn ich noch UND, ODER, NICHT.
    Aber was soll "PIND&(1<<0)" bedeuten?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    47
    Beiträge
    685
    ganz einfach, keine panik

    (a<<b) : verschiebt bitweise den wert a um b bits nach links
    (1<<0) : 00000001 nullmal nach links = 00000001
    damit kann man schön einzelne bits setzen, z.B. wenn man Bit 3 haben will
    (1<<3) : 00000001 wird danach zu 00001000

    PIND ist das byte, das den Zustand der Eingangspins von PORTD beinhaltet, das '&' ist ein bitweises 'und'

    nehmen wir an, an D sieht es binär so aus:
    00000000 : alle pins auf low
    00000000 'bitweises und' 00000001 : ergibt '0', da im Ergebnis ein Bit nur dann gesetzt wird, wenn es in beiden Operanden gesetzt ist. Daher kriegen wir immer '0', solange Bit0 auf 0 ist, die restlichen Bits werden durch die Verknüpfung ausmaskiert, PIND kann also z.B. auch so aussehen :
    11010010 : verknüpft wie oben ergibt auch 0, mann kann also später die anderen Pins auch benutzen, ohne das die Abfrage darunter leidet.

    sobald Bit0 jetzt mal high ist, sieht das dann so aus:
    xxxxxxx1 'bitweises und' 00000001 : ergibt 1 -> !=0

    das '!=0' macht Sinn, wenn man z.B. nicht PD0 sondern PD5 abfragen will:
    00100000 & (1<<5) : ergibt nämlich 1<<5=32 -> !=0

    ich hoffe, das hilft dir ein wenig.
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    @ Spongebob85: falls du schreibfaul bist , kannst du das !=0 auch weglassen, denn das macht das if quasi schon mit
    wenn PIND&(1<<0) 0 ist, entspricht das false und wenn der wert ungleich 0 ist, entspricht das einem true

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    Das is ja echt relativ einfach zu verstehen! Hätte ich nicht gedacht. War aber auch echt ne gute erklährung!!!

    Hab mein Programm jetzt umgeschrieben. Das funzt aber irgendwie immer noch nicht.

    Das Prog sieht jetzt so aus:

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    
    int main (void) {
    
     
     DDRA = 0xff;                  //Das bedeutet das Port B komplett als Ausgang deklariert ist, denk ich
     DDRD = 0x00;                  //Das bedeutet das Port D komplett als Eingang deklariert ist, denk ich
    
     while (1) 
     {
    
       if (PIND&(1<<0) !=0)
       {
       PORTA = 0x01;               //PortA0 auf 5V steuern wenn PortA ungleich 0
       }
       
       else
       PORTA = 0x00;               //wenn PortD0 1 ist sollen die pins des PortA 0V haben
       
     }                             //ende der While-schleife
    
    return 0;
    }

    Irgendwie geht das trotzdem nicht. Was hab ich denn jetzt noch falsch gemacht???

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    47
    Beiträge
    685
    Moin!
    Im Prinzip richtig, allerdings hab ich nochmal die if-Zeile geändert, ich glaube, da kommt sonst auch eine Warnung vom Compiler. Also der If-Teil (setze PA0 auf high) wird ausgeführt, wenn PD0 auf high liegt, und der Else-Teil (setze PA0 auf low) bei PD0 low, das war in Deinen Kommentaren nicht ganz klar.
    Und das setzen und löschen von einzelnen Ausgangsbits hab ich auch mal wie oben beschrieben umgebaut, damit das Ändern von PA0 auch funktioniert, ohne dass die anderen Bits beeinflusst werden, vorrausgesetzt, du willst mal nur einen Pin umschalten, und nicht den ganzen Port.
    Ansonsten sollte es so eigentlich funktionieren.

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    
    int main (void) {
    
     
     DDRA = 0xff;                  //Das bedeutet das Port B komplett als Ausgang deklariert ist, denk ich
     DDRD = 0x00;                  //Das bedeutet das Port D komplett als Eingang deklariert ist, denk ich
    
     while (1)
     {
    
       if (PIND&(1<<0) !=0) // ruhig die bitweise Verknüpfung noch mal in Klammern, also if ((PIND & (1<<0)) != 0), konkret -> wenn PD high dann
       {
       PORTA |= (1<<0);               //PortA0 auf 5V steuern wenn PortD0 ungleich 0, ausgeschrieben heißt das PORTA = PORTA | (1<<), wobei '|' bitweises 'oder' bedeutet
       }
       
       else
       PORTA &= (1<<0);               //wenn PortD0 0 ist soll PortA0 0V haben ,das heißt : ~(1<<0) setze Bit0 und invertiere das Ergebnis, danach mach eine &-Verknüpfung mit PORTA
       
     }                             //ende der While-schleife
    
    return 0;
    }
    Wenn man z.B. PA1 und PA3 auf high schalten möchte :

    PORTA |= (1<<1)|(1<<3)

    und zum wieder low schalten nur dieser beiden Pins :

    PORTA &= ~( (1<<1)|(1<<3) )

    Zu den Operatoren hab ich grad noch das hier gefunden :
    http://www.peacesoftware.de/ckurs4.html
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    //PortA0 auf 5V steuern wenn PortD0 ungleich 0
    das sollte eigentlich andersrum sein. Wenn PortD0 ungleich 0 ist also 5V Potential anliegt soll PortA0 auf 0V steuern. Die LED liegt mit der kathode am µController, aber das kann ich ja ummodeln wie ich will Die if-Anweisung is mir jetzt völlig verständlich und das (x<<y) hab ich auch begriffen. Jetzt hast du aber |= geschrieben. Das kenn ich wieder nicht. Aber ich werde mir das mit den Operatoren mal ansehen. vielleicht werde ich da ja schlauer.

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    Jetzt hast du aber |= geschrieben. Das kenn ich wieder nicht.
    Was genau verstehst du daran nicht? vklaffehn hat im von ihm geposteten code die ausgeschriebene Variante davon geschrieben.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2006
    Ort
    Hamburg
    Alter
    39
    Beiträge
    199
    Ich kann mir unter diesem Bitweisem oder einfach nicht so wirklich was vorstellen.

    Hab das programm jetzt genau so gemacht:
    Code:
    #include <avr/io.h>
    #include <stdint.h>
    
    int main (void) 
    {
    
     
     DDRA = 0xff;                
     DDRD = 0x00;                 
     
     
      while (1)
      {
    
         if ((PIND & (1<<0)) != 0)      // ruhig die bitweise Verknüpfung noch mal in Klammern, also if ((PIND & (1<<0)) != 0), konkret -> wenn PD high dann
         {
         PORTA |= (1<<0);               //PortA0 auf 5V steuern wenn PortD0 ungleich 0, ausgeschrieben heißt das PORTA = PORTA | (1<<), wobei '|' bitweises 'oder' bedeutet
         }
         
         else
         PORTA &= (1<<0);               //wenn PortD0 0 ist soll PortA0 0V haben ,das heißt : ~(1<<0) setze Bit0 und invertiere das Ergebnis, danach mach eine &-Verknüpfung mit PORTA
       
      }                                 //ende der While-schleife
    
    return 0;
    }
    Wenn ich jetzt "Make all" drücke kommt immernoch die gleiche Fehlermeldung wie am anfang wo ich euch noch nicht gefragt hab, und zwar diese:

    Code:
    > "make.exe" all
    MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
    Error makefile 451: Command syntax error
    Error makefile 452: Command syntax error
    Error makefile 453: Command syntax error
    Error makefile 454: Command syntax error
    Error makefile 457: Command syntax error
    Error makefile 458: Command syntax error
    Error makefile 460: Command syntax error
    Error makefile 461: Command syntax error
    Error makefile 463: Command syntax error
    Error makefile 465: Command syntax error
    Error makefile 466: Command syntax error
    Error makefile 521: Colon expected
    Error makefile 530: Colon expected
    Error makefile 552: Too many rules for target 'obj/%.o'
    Error makefile 562: Too many rules for target '%.s'
    Error makefile 569: Too many rules for target 'obj/%.o'
    Error makefile 598: Command syntax error
    *** 17 errors during make ***
    
    > Process Exit Code: 1
    > Time Taken: 00:01
    Ich kann mir das echt nicht erklähren. Hoffe es hat noch jemand ein guten tipp.

    MfG Jan

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen