Forum: Mikrocontroller und Digitale Elektronik R2R Netzwerk Problem


von Sebastion W. (Gast)


Lesenswert?

Hallo Liebe Forum Nutzer!

Im folgenden Programm wird mittels 5 Schalter eine Spannung von 1-5 Volt 
ausgewählt, danach wird mit einem anderen Schalter ein Interrupt 
ausgelöst, der die Bitmaske auf den PORTD überträgt, damit man die reale 
Spannung anliegen hat. Nur mein Problem ist es, dass man die Spannung 
nicht 0 setzen, kann, also wenn alle Schalter aus sind und der Interrupt 
auslöst. Wenn kein Schalter an ist, und ich den Interrupt auslöse, 
bleibt die Spannung gleich dem vorherigen Wert.

Schonmal vielen Dank für deine Hilfe!
1
#ifndef F_CPU
2
#define F_CPU 16e6                      //Takt der CPU einstellen, 16MHz
3
#endif
4
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
8
#define S1INIT    (DDRC  &=~(1<<PC0)) // DDRB  Bit2 löschen (als Eingang konfigurieren)
9
#define S1STATUS  (PINC  &  (1<<PC0)) // PortB Bit2 lesen   (high-aktiv)
10
 
11
#define S2INIT    (DDRC  &=~(1<<PC1)) // DDRB  Bit3 löschen (als Eingang konfigurieren)
12
#define S2STATUS  (PINC  &  (1<<PC1)) // PortB Bit3 lesen   (high-aktiv)
13
14
#define S3INIT    (DDRC  &=~(1<<PC2)) // DDRB  Bit2 löschen (als Eingang konfigurieren)
15
#define S3STATUS  (PINC  &  (1<<PC2)) // PortB Bit2 lesen   (high-aktiv)
16
 
17
#define S4INIT    (DDRC  &=~(1<<PC3)) // DDRB  Bit3 löschen (als Eingang konfigurieren)
18
#define S4STATUS  (PINC  &  (1<<PC3)) // PortB Bit3 lesen   (high-aktiv)
19
20
#define S5INIT    (DDRC  &=~(1<<PC4)) // DDRB  Bit3 löschen (als Eingang konfigurieren)
21
#define S5STATUS  (PINC  &  (1<<PC4)) // PortB Bit3 lesen   (high-aktiv)
22
23
uint8_t output;        //Byte Variable output
24
25
ISR(PCINT1_vect){      //Interrupt Service Routine
26
27
  PORTD = output;      //Ausgänge setzen
28
}
29
30
int main(void){  
31
32
    DDRD = 0xFF;        //PORTD output
33
  
34
  sei();                  //Enable Global Interrupts ("cli();" zum deaktivieren)
35
36
  PCICR  = 1<<PCIE1;      //Pin Change Interrupt Control Register, PCIE1 flag HIGH
37
    PCMSK1 = 1<<PCINT13;    //Pin Change Mask Register 1, Pin Change Interrupt on PCINT11 (PC5)
38
39
  S1INIT;
40
  S2INIT;
41
  S3INIT;
42
  S4INIT;
43
    
44
  while (1){  
45
46
    //1 Volt
47
    switch(S1STATUS){
48
49
      case 1: output = 51; 
50
      break;      
51
    }
52
    
53
    //2 Volt
54
    switch(S2STATUS){
55
56
      case 1: output = 102;   
57
      break;    
58
    }
59
60
    //3 Volt
61
    switch(S3STATUS){
62
63
      case 1: output = 153; 
64
      break;      
65
    }
66
67
    //4 Volt
68
    switch(S4STATUS){
69
70
      case 1: output = 204;   
71
      break;    
72
    }
73
74
    //5 Volt
75
    switch(S5STATUS){
76
77
      case 1: output = 255;
78
      break;
79
        
80
      }
81
  }
82
}

von MaWin (Gast)


Lesenswert?

Du solltest output als volatile deklarieren.

Aber ebenso solltest du mal ein Kapitel über das Entprellen von Tastern 
lesen.

Und die Übersichtlichkeit durch Worte wie "INIT" und "STATUS" ist auch 
miserabel.

Ein switch case 1 könnte einfacher mit einem if realisiert werden.

Und die Funktion des Programms wenn mehr als 1 Schalter aktiv ist, ist 
ebenfalls zweifelhaft.

Und ob FCPU wirklich sinnvollerweise eine Floatingpointzahl sein 
sollte....

von Jim M. (turboj)


Lesenswert?

Sebastion W. schrieb:
> Wenn kein Schalter an ist, und ich den Interrupt auslöse,
> bleibt die Spannung gleich dem vorherigen Wert.

Ja. Genau das hast Du so programmiert. Wenn Du eine andere 
Funktionalität haben wolltes musst Du was umprogrammieren.

Wegen Deiner ziemlich hirntoten switch(SxSTATUS) Methode ist das sehr 
viel komplizierter als nötig.


Hint:
1
switch (PINC &0x1F) {
2
3
  case 1:
4
// ...
5
  case 2:
6
// ...
7
}

von Ratgeber (Gast)


Lesenswert?

Am besten fängst Du mit dem Tutorial hier im Forum an.

Bei Deinem Problem ist einfach zu viel falsch, dass eine einzelne oder 
auch 2 oder 3 Korrekturen, die Lösung sein könnten. Das wäre nur der 
Fall, falls das Konzept und Dein Verständnis vom Programmieren und Deine 
C-Kenntnisse wenigstens näherungsweise der Aufgabenstellung angemessen 
wären.
Und - ich schreibe das mit höflichen Absichten -: Das ist einfach nicht 
der Fall. Tut mir leid.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Andere Idee: Man spart sich den MC und schaltet ein R Netzwerk direkt 
mit Schaltern?

von Sebastion W. (Gast)


Lesenswert?

Also dass mein Lehrer nicht so gut ist, wusste ich schon vorher, aber 
dass er so miserabel ist...

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
Noch kein Account? Hier anmelden.