Forum: Mikrocontroller und Digitale Elektronik Attiny85 Zufallswürfel


von R. B. (dxx255)


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

von chris (Gast)


Lesenswert?

Roman B. schrieb:
> DDRB  = 0xff;

was erwartest du denn an einem Pin auch als ADC-Ergebnis, wenn du ihn 
als Ausgang konfigurierst?

von R. B. (dxx255)


Lesenswert?

Dankeschön:))))

von R. B. (dxx255)


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?

von Gerald G. (gerald_g)


Lesenswert?

Wie sieht es mit Kommentaren aus?
Bei einem Würfel, bei dem ein Knopf gedrückt wird, würde ich einfach den 
Zähler hochlaufen lassen, solange der Knopf gedrückt wird. Da hast du 
auf jeden Fall Zufallszahlen wenn das mit 10mhz passiert

von R. B. (dxx255)


Lesenswert?

Aber es erfolgt ja nur eine Zuweisung von Werten aus dem Array und 0x00. 
Da kommt ja gar keine 4 vor!Wie ist so etwas möglich? Was ist unklar? Wo 
sind Kommentare erforderlich?

: Bearbeitet durch User
von chris (Gast)


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

von R. B. (dxx255)


Lesenswert?

Klar! Vielen Dank!!

von Gerald G. (gerald_g)


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];

von chris (Gast)


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.

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.