www.mikrocontroller.net

Forum: Projekte & Code Elektronischer Wüffel [ATtiny2313]


Autor: Markus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Es ist ein mini Projekt und auch mehr ein Spielzeug, aber vielleicht hat 
trotzdem jemand Interesse daran.
Es ist ein elektr. Würfel der auf einem Zufallszahlengenerator basiert.

"Features":
Maximaler Stromverbrauch (Augenzahl = 6): 45mA - max 1 min
Software verfügt über Sleep nach 1 min kein Tastendruck (EXT INT0 LOW 
LEVEL INTERRUPT).
Stromverbrauch Sleep: nicht messbar
Wake up: LOW LEVEL INT0 = EXT INT0 für Zufallszahl.
Nach Drücken der Taste um Würfelvorgang einzuleiten ist erst wieder das 
Drücken möglich, wenn die  Statusled Leuchtet (a' la: gewürfelt ist 
gewürfelt).

Ubrigens: im Code ist in der Anweisung switch(anzahl) eine ganze Menge 
auskommentiert. Das sind unterschiedliche "animationen" die das Würfeln 
darstellen sollen!

Soweit ich weiß habe ich in der Software keine Fehler... ist mein erstes 
AVR-Projekt :) Irgendwie machts spaß, vielleicht erstelle ich auch mal 
eine Leiterplatte dafür. wenn, dann stelle ich es auch hier rein!

LG und viel spaß beim ev nachbauen
/*  Eckdaten:
  Maximaler Stromverbrauch (Augenzahl = 6): 45mA - max 1 min
  Stromverbrauch Sleep: nicht messbar
  Stromverbrauch ohne Sleep, keine LED: 0,5mA 
  Software verfügt über Sleep nach 1 min kein EXT0 INT. 
  Wake up: LOW LEVEL INT0 = EXT INT0 für Zufallszahl
*/

//----------------------------------------------------------------------
#include  <avr/io.h>    // AVR Register und Konstantendefinitionen
#include    <util/delay.h>
#include  <avr/interrupt.h>
#include    <stdio.h>
#include   <stdlib.h>
#include   <math.h>
#include   <avr/sleep.h>
unsigned char anzahl = 0;  // Anzahl der Timer0 Überläufe für Zeitverzögreung
void zufallszahl();  

//-----------------H A U P T P R O G R A M M-------START----------------
//-----------------R E G I S T E R   I N I T-------START----------------

main ()            // Hauptprogramm, startet bei Power ON und Reset
{  DDRB = 0xFF;       // PORT B = AUSGANG (für die LEDS)
  PORTB = 0x00;      // AUSGANGSPINS resetten
  DDRD = 0x00;
  GIMSK = 0b01000000;    // Ext0 Int enable
  SREG = 0b10000000;     // Golbal interrupt enable
  MCUCR = 0b01110000;    // LOW LEVEL INT0 = interrupt UND POWER DOWN funktion
  TIMSK = 0b00000010;    // Timer0 Overflow Interrupt enable

//-----------------R E G I S T E R   I N I T-------END-------------------  
  while(1)
  {  
    if(TCCR0B == 0x00)  // wenn Timer0 angehalten ist, PORTB löschen und in den 
    {  
      PORTB = 0x00;   // POWER DOWN mode gehen. wird durch LOW LEVEL INT0 reaktiviert
      sleep_mode();  // siehe MCUCR setup
    }
  }
}

//----------------H A U P T P R O G R A M M-------END--------------------
//----------------E X T   I N T 0   I S R---------START----------------- 

ISR(INT0_vect)        // EXT INT0 LOW LEVEL INTERRUPT ISR
  {    GIMSK = 0x00;  // EXT INT0 verbieten - gewürfelt ist gewürfelt ;)
      anzahl = 0;    // Verzögerungszähler aus NULL setzen  
      zufallszahl();  // Zufallszahl Funktion starten
  }

//----------------E X T   I N T 0   I S R---------END----------------- 
//----------------T I M E R 0   O V E R V L O W   I S R--------START--


ISR(TIMER0_OVF_vect)
  {  anzahl++;                // Verzögerungszähler um 1 erhöhen
    if(anzahl < 14) TCCR0B = 0b00000100;  // TIMER0 RUN mit F_CPU / 256 für eine gut  einstellbare Zeitverzögerung der
    if(anzahl == 14) TCCR0B = 0b00000101;  // TIMER0 RUN mit F_CPU / 1024 für längere Verzögerung bis zum Anzeigen der Zahl
    switch(anzahl)              // einstellbare Zeitverzögerung der
    {  /*                  // animation des Würfelns
      case 1: PORTB = 0b00000001; break;
      case 2: PORTB = 0b00000010; break;
      case 3: PORTB = 0b00000100; break;
      case 4: PORTB = 0b01000000; break;
      case 5: PORTB = 0b00100000; break;
      case 6: PORTB = 0b00010000; break;
      case 7: PORTB = 0b00001000; break;
      
      case 1: PORTB = 0b00000001; break;
      case 2: PORTB = 0b00000011; break;
      case 3: PORTB = 0b00000111; break;
      case 4: PORTB = 0b01000111; break;
      case 5: PORTB = 0b01100111; break;
      case 6: PORTB = 0b01110111; break;
      case 7: PORTB = 0b01111111; break;
      
      case 1: PORTB = 0b00000001; break;
      case 2: PORTB = 0b00000011; break;
      case 3: PORTB = 0b00000110; break;
      case 4: PORTB = 0b00001100; break;
      case 5: PORTB = 0b00011000; break;
      case 6: PORTB = 0b00110000; break;
      case 7: PORTB = 0b00100001; break;
      case 8: PORTB = 0b00000011; break;
      case 9: PORTB = 0b00000110; break;
      case 10: PORTB = 0b00001100; break;
      case 11: PORTB = 0b00011000; break;
      case 12: PORTB = 0b00110000; break;
      case 13: PORTB = 0b00100000; break;
      */
      case 1: PORTB = 0b00000001; break;
      case 2: PORTB = 0b00000011; break;
      case 3: PORTB = 0b00000111; break;
      case 4: PORTB = 0b00001111; break;
      case 5: PORTB = 0b00011111; break;
      case 6: PORTB = 0b00111111; break;
      case 7: PORTB = 0b00111111; break;
      case 8: PORTB = 0b00111111; break;
      case 9: PORTB = 0b00111110; break;
      case 10: PORTB = 0b00111100; break;
      case 11: PORTB = 0b00111000; break;
      case 12: PORTB = 0b00110000; break;
      case 13: PORTB = 0b00100000; break;

      case 14: PORTB = 0x00; 
           TCNT0 = 0x00; break;      // TIMER0 zurücksetzen damit definierte Verzögerung bis zum Anzeigen der Zahl gewährleistet ist
      case 15: PORTB = GPIOR0;         // Display Zufallszahl
           GIMSK = 0b01000000;       // Ext0 Int wieder erlauben!!!
           TCNT0 = 0x00; break;  
      case 247: TCCR0B = 0x00;        // TIMER0 STOP
            TCNT0 = 0x00;  break;      // TIMER0 rücksetzen                                      
    }    
  }

//----------------T I M E R 0   O V E R V L O W   I S R--------END-----
//----------------Z U F A L L S Z A H L G E N E R A T O R------START---

void zufallszahl()
{    unsigned char min = 1;
    unsigned char max = 6;
    unsigned char erg = 0;
    
    erg = (rand() % (max-min+1) +min);      // Zufallszahl erzeugen
    switch(erg)                  // Umcodierung der Zufallszahl
    {  case 1: GPIOR0 = 0b11000000; break;    // zu den entsprechenden Bit-
      case 2: GPIOR0 = 0b10100100; break;    // kombinationen für den Würfel
      case 3: GPIOR0 = 0b11100100; break;
      case 4: GPIOR0 = 0b10101101; break;
      case 5: GPIOR0 = 0b11101101; break;    
      case 6: GPIOR0 = 0b10111111; break;
         
    }
    SREG = 0b10000000;                //Golbal interrupt enable
    TCCR0B = 0b00000101;            //Timer0 RUN mit f = F_CPU / 1024  
  }
//----------------Z U F A L L S Z A H L G E N E R A T O R-----END------

Autor: Paule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

tolles Projekt.

Könntest du mal bitte eine fertige Hex Datei hochladen, ich habe keinen 
C Copiler und wollte eigentlich auch keinen installieren. Komme aus der 
Bascom Fraktion, für ein Projekt lohnt das installieren nicht wirklich.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mich auch über eine HEX Datei freuen !!

Autor: Bloody (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wurde im anderen Forum gefragt, ob ichs compelieren kann.
Hier wird es auch gefragt:

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.