R2R Netzwerk Problem

Gast #4834631
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
}
Gast #4834637
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....
#4834645
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
}
Gast #4834646
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.