Attiny85 Zufallswürfel

OP #3723123
Lesenswert?
• ▲
▼
Hallo
Ich möchte einen kleinen elektronischen Würfel mit einem Attiny85 bauen.
1
#include <avr/io.h>          
2
#ifndef F_CPU
3
#define F_CPU 8000000UL
4
#endif
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7
#include <avr/sleep.h>
8
int result;
9
int i;
10
unsigned char nums[6]={0x01,0x02,0x03,0x06,0x07,0x0e};
11
int main (void) {           
12
     ADMUX=(1<<REFS2)|(1<<REFS1);
13
  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1);
14
  while( ADCSRA & (1<<ADSC) );
15
  result = ADC;
16
    DDRB  = 0xff;                    
17
  GIMSK=(1<<PCIE);
18
  PCMSK=(1<<PCINT4);
19
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
20
  sei();
21
   while(1) {  
22
         sleep_mode();     
23
   }
24
   return 0;                
25
}
26
ISR(PCINT0_vect){
27
  
28
  if(PINB & (1<<PB4)){
29
  for(i=0;i<20;i++){
30
    _delay_ms(1);
31
  }
32
  ADMUX = (ADMUX & ~(0x1F));
33
  ADCSRA|=(1<<ADSC);
34
  while( ADCSRA & (1<<ADSC) );
35
  result = ADC%6+1;
36
  PORTB=0x00;
37

38
  PORTB|=nums[result];
39
  
40
  for(i=0;i<500;i++){
41
    _delay_ms(1);
42
  }
43
  PORTB=0x00;
44
  }
45
}
Leider gibt der Code immer dieselbe Zahl aus;( Fuses sind wie folgt 
gesetzt: -U lfuse:w:0xe2:m -U hfuse:w:0x5f:m -U efuse:w:0xff:m
Was ist da schief gegangen?
Bitte um Hilfe
OP #3723149
Lesenswert?
• ▲
▼
Code geändert:
1
#include <avr/io.h>          
2
#ifndef F_CPU
3
#define F_CPU 8000000UL
4
#endif
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7
#include <avr/sleep.h>
8
int result;
9
int i;
10
unsigned char nums[6]={0x01,0x02,0x03,0x06,0x07,0x0e};
11
int main (void) {           
12
     ADMUX=(1<<REFS2)|(1<<REFS1);
13
  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1);
14
  while( ADCSRA & (1<<ADSC) );
15
  result = ADC;
16
    DDRB  = (0xff)&(~(1<<PB5));                    
17
  GIMSK=(1<<PCIE);
18
  PCMSK=(1<<PCINT4);
19
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
20
  sei();
21
   while(1) {  
22
         sleep_mode();     
23
   }
24
   return 0;                
25
}
26
ISR(PCINT0_vect){
27
  
28
  if(PINB & (1<<PB4)){
29
  for(i=0;i<20;i++){
30
    _delay_ms(1);
31
  }
32
  ADMUX = (ADMUX & ~(0x1F));
33
  ADCSRA|=(1<<ADSC);
34
  while( ADCSRA & (1<<ADSC) );
35
  result = ADC%6+1;
36
  PORTB=nums[result];
37
  
38
  for(i=0;i<1000;i++){
39
    _delay_ms(1);
40
  }
41
  PORTB=0x00;
42
  }
43
}
Irgendwie kommt es aber dazu, dass PB2 alleine eingeschaltet wird. Wie 
kann das sein?
Gast #3723209
Lesenswert?
• ▲
▼
1
result = ADC%6+1;

was passiert, wenn ADC%6 den Wert 5 liefert?
Du greifst dann auf nums[6] zu, dieses Element gibts aber garnicht in 
deinem Array. Arrays fangen in C bei 0 an.
--> mach stattdessen mal:
1
result = ADC%6;


lg
Chris
#3723235
Lesenswert?
• ▲
▼
Kommentare nur allgemein, bereits in einer Woche weißt du nicht mehr auf 
welche Einstellungen du den ADC und den PCInt gesetzt hast.
Wie oben geschrieben gibt es den arraywert nums[6] nicht.
Wie ist dein Schalter angeschlossen? Offensichtlich fragst du ab ob er 
high ist. Pulldown extern angeschlossen? Wenn ja, warum nicht den 
internen pullup benutzen? (Am Ende aufpassen dass du den pullup nicht 
ausschaltest)
_delay_ms () nimmt schon eine Weile auch größere zahlen, die Schleife 
ist nicht nötig.
Warum fragst du in der Interruptroutine, der durch pin4 ausgelöst wird, 
ob pin4 gedtückt wurde?
Die variable result ist nicht nötig, es reicht ein:

PORTB= nums[adc%6];
Gast #3723314
Lesenswert?
• ▲
▼
Gerald G. schrieb:
> Wie ist dein Schalter angeschlossen? Offensichtlich fragst du ab ob er
> high ist. Pulldown extern angeschlossen?

gute Frage.
Im Code schaltest du nämlich alle Pins als Ausgang (bis auf den ADC 
mittlerweile).
D.h. durch Drücken des Tasters verursachst du höchstwahrscheinlich einen 
Kurzschluss. Der Strom wird dabei durch die µC-Ausgangsendstufe 
begrenzt, auf Dauer kann dadurch der µC (teilweise zumindest) kaputt 
gehen.

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.