Forum: Mikrocontroller und Digitale Elektronik 16-Bit Zahl auf LCD


von Felix the cat (Gast)


Lesenswert?

Ich hab ein Problem, ich möchte eine 16 Bit Binärzahl, die in zwei 
Registern ist, auf das LCD ausgeben und zwar als Integer Dezimalzahl 
habe aber noch keinen Plan wie ich das am besten realisieren soll.
Wenn ich z.B.  1111'1111'1111'1111 habe soll auf dem Display  -32768 
erscheinen, habe ich 111'1111'1111'1111 soll 32767 erscheinen.
Hat jemand eine Idee wie man das realisieren könnte?

von Ralf Schumnig (Gast)


Lesenswert?

Hi Felix,

kennst Du http://www.atmel.com/atmel/acrobat/doc0938.pdf ?

Vorher würde ich das höchstwertigste Bit (Vorzeichen) testen, ggfls. 
Minuszeichen generieren und dann im MSB löschen.

Grüsse
Ralf

von Felix the cat (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Danke, ich habe es unterdessen geschafft!
Wer genaueres wissen möchte soll sich die Doku anschauen, die ich 
geschrieben habe (atached).

MfG

Felix

von dunial (Gast)


Lesenswert?

Hallo,

kann jemand den oberen Code einmal in C für einen Mega8 umschreiben ?
Die 16Bit Zahl soll aus dem Zählregister des Timer1 gelesen werden und 
dann auf einem LCD-Display mit einer 4-Bit-Ansteuerung angezeigt werden.
Das wäre sehr nett.

Gruß
D.

von Karl H. (kbuchegg)


Lesenswert?

dunial schrieb:
> Hallo,
>
> kann jemand den oberen Code einmal in C für einen Mega8 umschreiben ?
> Die 16Bit Zahl soll aus dem Zählregister des Timer1 gelesen werden und
> dann auf einem LCD-Display mit einer 4-Bit-Ansteuerung angezeigt werden.
> Das wäre sehr nett.
>
1
  char Buffer[8];
2
  uint16_t Wert;
3
4
  Wert = TCCR1;
5
  utoa( Wert, Buffer, 10 );
6
  lcd_string( Wert );

Wobei lcd_string eine Funktion ist, die einen Textstring auf einem LCD 
ausgeben können muss.

von H.Joachim S. (crazyhorse)


Lesenswert?

oder sprintf(), ok, frisst rel. viel Platz.

von dunial (Gast)


Lesenswert?

Hallo,

bei "Wert = TCCR1;" bringt der Compiler eine Fehlermeldung.
Ich dachte immer, es wird das TCNT1-Register ausgelesen und nicht das 
TCCR1.
Beim Test erscheinen keine Zahlen, sondern zusammenhangslose Buchstaben 
und Zeichen...

Der Zähler wird mit einem externen Signal gespeist, wobei die steigenden 
Flanken erkannt werden (TCCR1B=0x07;). Bei jedem Impuls zählt der Timer 
logischerweise immer 1 aufwärts, und das eine Minute lang (dafür 
verwende ich in einer Schleife den Timer0). Der aktuelle Wert soll, wie 
ich schon sagte, auf dem LCD erscheinen.
Ist es auch möglich, ein Komma an folgende Stelle zu setzen ("xxxxxx" zu 
"xxxx,xx") und wenn das vorletzte oder das letzte "x" = 0 ist, die leere 
Stelle hinter dem Komma und die Stelle vor dem Komma mit einer Null 
aufzufüllen (z.B. 0,54 (bei Zählstand 54) oder 0,09 (bei Zählstand 9) ?

Gruß
D.

von Karl H. (kbuchegg)


Lesenswert?

dunial schrieb:
> Hallo,
>
> bei "Wert = TCCR1;" bringt der Compiler eine Fehlermeldung.
> Ich dachte immer, es wird das TCNT1-Register ausgelesen und nicht das
> TCCR1.

Du hast recht.
Ich hab nicht im Datenblatt nachgesehen und offensichtlich hat mir mein 
Gedächtnis beim schnellen Tippen einen Streich gespielt.

> Beim Test erscheinen keine Zahlen, sondern zusammenhangslose Buchstaben
> und Zeichen...

Dann zeig den möglichst kompletten Code.
Meine Kristallkugel tippt auf einen Array-Überlauf, weil du den 
Ausgabebuffer zu klein dimensioniert hast.

> Ist es auch möglich, ein Komma an folgende Stelle zu setzen ("xxxxxx" zu
> "xxxx,xx") und wenn das vorletzte oder das letzte "x" = 0 ist, die leere
> Stelle hinter dem Komma und die Stelle vor dem Komma mit einer Null
> aufzufüllen (z.B. 0,54 (bei Zählstand 54) oder 0,09 (bei Zählstand 9) ?

Alles ist möglich.
In dem Fall, wenn die Laufzeit bzw. Programmgröße nicht dagegen spricht, 
würde ich zu sprintf greifen

http://www.mikrocontroller.net/articles/FAQ#Wie_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F
1
  char Buffer[10];
2
3
  ...
4
5
  sprintf( Buffer, "%d,%02d", Wert / 100, Wert % 100 );
6
  lcd_string( Buffer );

von Ste N. (steno)


Lesenswert?

Hallo dunial,

ich hatte mal das selbe Problem und nicht ausreichend Platz für 
sprintf(). Habe mir dann folgende Funktion geschrieben welche sicher 
noch nicht das Optimun ist, aber für meine Zwecke ausreichend war.
1
// Funktion Int to String (Zahl, länge des fertigen String, Komma)
2
// Komma = 2 -> Zahl / 100, Komma = 0 für kein Komma
3
char *int_to_str (signed long zahl, unsigned char len, signed char komma)
4
{
5
static char buffer[16]; // String für Übergabe  
6
7
buffer[len] = 0;
8
  
9
if (zahl<0)       // wenn Zahl negativ... 
10
{
11
  zahl = -zahl;     // Zahl positiv machen
12
  buffer[0] = '-';   // an erste Stelle im String ein '-' schreiben 
13
}
14
else buffer[0] = ' ';   // ansonsten ein Leerzeichen 
15
16
do
17
{  
18
  if ((komma < 0) && !(zahl % 10) && !(zahl / 10)) buffer[--len] = ' ';  // führende Nullen ausblenden
19
  else buffer[--len] = zahl % 10 + '0';  // Modulo 10 der Zahl in String schreiben
20
  
21
  if (--komma == 0) buffer[--len] = '.';  // wenn Kommastelle erreicht '.' schreiben
22
  
23
  zahl /= 10;    // Zahl durch 10
24
}
25
while (len > 1);   // solange bis der String voll ist, erstes Zeichen nicht überschreiben, Vorzeichen!
26
return buffer;
27
}

Viele Grüße,
Steffen

von Philipp B. (philipp_burch)


Lesenswert?

Karl heinz Buchegger schrieb:
>> Beim Test erscheinen keine Zahlen, sondern zusammenhangslose Buchstaben
>> und Zeichen...
>
> Dann zeig den möglichst kompletten Code.
> Meine Kristallkugel tippt auf einen Array-Überlauf, weil du den
> Ausgabebuffer zu klein dimensioniert hast.

Meine Kristallkugel tippt eher darauf, dass du wenigstens den Puffer zum 
LCD schicken solltest und nicht den Int ;)

Anstelle
1
  char Buffer[8];
2
  uint16_t Wert;
3
4
  Wert = TCCR1;
5
  utoa( Wert, Buffer, 10 );
6
  lcd_string( Wert );
besser
1
  char Buffer[8];
2
  uint16_t Wert;
3
4
  Wert = TCNT1;
5
  utoa( Wert, Buffer, 10 );
6
  lcd_string( Buffer );

von Karl H. (kbuchegg)


Lesenswert?

Philipp Burch schrieb:
> Karl heinz Buchegger schrieb:
>>> Beim Test erscheinen keine Zahlen, sondern zusammenhangslose Buchstaben
>>> und Zeichen...
>>
>> Dann zeig den möglichst kompletten Code.
>> Meine Kristallkugel tippt auf einen Array-Überlauf, weil du den
>> Ausgabebuffer zu klein dimensioniert hast.
>
> Meine Kristallkugel tippt eher darauf, dass du wenigstens den Puffer zum
> LCD schicken solltest und nicht den Int ;)


Mist.
Mea culpa.

Danke für die Korrektur.

von dunial (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

vielen Dank erst einmal für die vielen Antworten :-) !!
Den Code habe ich beigefügt. Evtl. ist es noch wichtig zu sagen, dass 
ich mit AVR Studio 4 und mit dem Compiler WinAVR arbeite.
Die Variante von Steffen werde ich morgen einmal ausprobieren.

Einmal zur Erläuterung meines Projektes:

Es soll eine Zähleinheit für einen selbstgebauten Geigerzähler werden. 
Der Impuls kommt von einem NE555, der die Impulse des Zählrohrs für den 
Mega8 aufbereitet.
Das Programm besteht aus 3 Unterprogrammen:
-Programm A: eine Minute lang die ankommenden Impulse zählen (soll auch 
schon auf LCD ausgegben werden). Nach der Minute soll das Ergebnis 15 
Sekunden lang angezeigt werden. Wenn keine andere Programmwahl durch 
einen Taster erfolgt, läuft das Programm A erneut durch. Durch einen 
Reset-Impuls (nicht der Reset des Controllers an Pin PC6 !) kann man zur 
main-Schleife zurückkehren.
-Programm B: 30 Sekunden lang messen. Danach das Ergebnis in der 2. 
Zeile anzeigen ('xxxx,xx 30sec.') und den Wert in µSv/h in der 1. Zeile 
berechnen und ausgeben.
-Programm C: 10 Sekunden messen. Sonst genau so wie B.
Das schwierige war nun, einen geeigneten Zähler zu programmieren. Der 
einfache 8Bit-Timer0 zählt ja nur bis 255. Da hätte man dann bei jedem 
Überlauf Variabeln setzen müssen und Gleichungen bearbeiten, damit der 
Gesamtzählwert angezeigt wird. Also dachte ich mir, nehme ich den Timer1 
der bis ca. 65.500 zählen kann. Da aber bei stark strahlenden Mineralien 
das noch nicht ausreicht, habe ich mit der Formel ZA=Z1+ZG gearbeitet. 
ZA ist der Ausgabewert auf dem LCD-Display. Z1 ist der momentane 
Zählwert des Timer1. Wenn Z1 größer gleich 50.000 ist, dann wird Z1=ZG 
gesetzt und der Timer1 wieder auf null gesetzt. Somit kann man insgesamt 
bis ca. 115.500 zählen. Das entspricht dann 1155,00µSv/h

Die strings für das LCD wollte ich in den EEPROM schreiben. Das 
Schreiben an sich hat auch funktioniert, aber beim Test war dann die 
ganze Anzeige schwarz ??? Deshalb habe ich die strings direkt in main 
eingegeben.

Gruß
Daniel

von Karl H. (kbuchegg)


Lesenswert?

Die dringlichste Kritik:

Du solltest den Befehl 'goto' schleunigst aus dem C-Wortschatz 
streichen.

von Karl H. (kbuchegg)


Lesenswert?

TCNT1=0x00;    //Z�hlregister Timer1 wird auf null gesetzt
      TCNT1H=0x00;  //High-Byte Timer1 wird auf null gesetzt
      TCNT1L=0x00;  //Low-Byte Timer1 wird auf null gesetzt


TCNT1 ist das 16-Bit Zählregister!
Bestehend aus TCNT1H und TCNT1L.
Obiges ist also doppelt gemoppelt.

von H.Joachim S. (crazyhorse)


Lesenswert?

ach, manchmal ist goto sowas von nützlich.

von Karl H. (kbuchegg)


Lesenswert?

if (TCNT1>=0xc350)  //ist Timer1 >= 50.000 ?


Warum schreibst du nicht gleich

      if (TCNT1 >= 50000)  //ist Timer1 >= 50.000 ?

Jetzt steht im Kommentar dasselbe wie im Code: -> Kommentar kann 
entfallen und braucht daher auch nicht weiter gepflegt werden. Und vor 
allen Dingen: Ein nicht vorhandener Kommentar kann auch nicht falsch 
sein, wenn der Code mal geändert wird.

von Karl H. (kbuchegg)


Lesenswert?

H.joachim Seifert schrieb:
> ach, manchmal ist goto sowas von nützlich.

Aber nicht in diesem Programm :-)
Das ist an der Schwelle zum Spaghetti-Code

von dunial (Gast)


Lesenswert?

"Die dringlichste Kritik:

Du solltest den Befehl 'goto' schleunigst aus dem C-Wortschatz
streichen."

...es funktioniert aber ;-)
Das werde ich natürlich in Zukunft anders lösen. Das ist mein erstes 
C-Programm, welches ich entwerfe. Da fällt einem selbst so ein 'Fehler' 
gar nicht auf.

Gruß
Daniel

von dunial (Gast)


Lesenswert?

Hallo,
hier einmal ein Ausschnitt aus dem Quelltext. Der Sekundentimer und der 
eigentliche Programmablauf funktionieren einwandfrei (das "goto" habe 
ich erst einmal so gelassen (schäm*)). Nur das Anzeigen der Zahl 
funktioniert noch nicht. Die Variable 'za' soll angezeigt werden. Die 
Schleife "retmin1" dauert eine Minute und hier soll der laufende 
Zählstand des Timer1 auf dem LCD-Display ausgegeben werden.
Kann sich jemand einmal den Code ansehen und diesen berichtigen, damit 
das angezeigt wird, was ich will ?
Das wäre sehr nett.

Gruß
Daniel
1
...
2
zg=0x00;
3
za=0x00;
4
sekunde=0x00;
5
TCNT0=0x00;
6
TCCR0|=0x03;
7
8
...
9
      TCNT1=0x00;
10
      TCCR1B=0x07;
11
      goto retmin1;
12
    
13
retmin1:
14
      za=z1+zg;
15
      z1=TCNT1;
16
      
17
    set_cursor(0,1);
18
19
char *int_to_str (unsigned char len, signed char komma)
20
  {
21
  static char buffer[16];
22
23
  buffer[len] = 0;
24
  
25
  if (za<0) 
26
    {
27
      za = -za; 
28
      buffer[0] = '-';
29
    }
30
    else buffer[0] = ' ';
31
32
  do
33
  {  
34
    if ((komma < 0) && !(za % 10) && !(za / 10)) buffer[--len] = ' ';
35
    else buffer[--len] = za % 10 + '0';
36
  
37
    if (--komma == 0) buffer[--len] = '.';
38
  
39
    za /= 10;
40
  }
41
  while (len > 1);
42
return buffer;
43
}
44
45
if (TCNT0<0xff)
46
  {
47
  goto retmin1;
48
  }
49
if (TCNT0=0xff)
50
  {
51
  sekunde++;
52
  TCNT0=0x00;
53
    if (sekunde<=3685)
54
    {
55
    goto retmin1;
56
    }
57
    else
58
    {
59
    TCNT0=0x00;
60
    TCCR1B=0x00;
61
    set_cursor(2,2);
62
    ...
63
    }
64
   }
65
goto retmin1;
66
...

von Karl H. (kbuchegg)


Lesenswert?

dunial schrieb:

> Kann sich jemand einmal den Code ansehen und diesen berichtigen, damit
> das angezeigt wird, was ich will ?

Du brauchst dringend ein C-Buch

Der Teil hier
1
char *int_to_str (int za, unsigned char len, signed char komma)
2
{
3
  static char buffer[16];
4
5
  buffer[len] = 0;
6
 
7
  if (za<0)
8
  {
9
    za = -za;
10
    buffer[0] = '-';
11
  }
12
  else buffer[0] = ' ';
13
14
  do
15
  {
16
    if ((komma < 0) && !(za % 10) && !(za / 10)) buffer[--len] = ' ';
17
    else buffer[--len] = za % 10 + '0';
18
 
19
    if (--komma == 0) buffer[--len] = '.';
20
21
    za /= 10;
22
  } while (len > 1);
23
24
  return buffer;
25
}

ist eine Funktion für sich. Die wird ausserhalb von main() geschrieben
1
char *int_to_str (int za, unsigned char len, signed char komma)
2
{
3
  ...
4
  ...
5
  return buffer;
6
}
7
8
int main()
9
{
10
  ...
11
}

Irgendwo musst du die Funktion dann aber auch aufrufen
1
...
2
retmin1:
3
      za=z1+zg;
4
      z1=TCNT1;
5
      
6
      set_cursor(0,1);
7
8
      ptr = int_to_str( za, 3, 1 );  // ob 3 und 1 stimmen kann ich nicht sagen
9
                               // musst du bestimmen, was da passt
10
      lcd_string( ptr );
11
12
      if (TCNT0<0xff)
13
      {
14
        goto retmin1;
15
      }
16
...

und du musst dir noch eine Variable ptr definieren
1
  char * ptr;

von Karl H. (kbuchegg)


Lesenswert?

Warum hast du eigentlich die ursprüngliche Lösung nicht dem Prinzip nach 
beibehalten.

Ursprünglich war das
1
    retmin1:
2
      za=z1+zg;
3
      z1=TCNT1;    //Variable z1 nimmt den Wert des Z�hlregisters TCNT1 von Timer1 an
4
      
5
6
        /*Wert, der in "lcd_string" steht, wird  aus den 16 Bits des Timer1 ausgelesen. */
7
        //za Anzeige auf LCD (noch nicht erf�llt)
8
      char Buffer[8];
9
        utoa( z1, Buffer, 10 );
10
      set_cursor(0,1);
11
        lcd_string( Buffer );

Jetzt willst du za ausgeben. za ist ein unsigned long und die 
korrspondierende Funktion zur Wandlung dafür heisst ultoa
1
    retmin1:
2
      za=z1+zg;
3
      z1=TCNT1;    //Variable z1 nimmt den Wert des Z�hlregisters TCNT1 von Timer1 an
4
      
5
6
        /*Wert, der in "lcd_string" steht, wird  aus den 16 Bits des Timer1 ausgelesen. */
7
        //za Anzeige auf LCD (noch nicht erf�llt)
8
      char Buffer[12];    /* 7 benutzbare Zeichen könnte bei einem ulong knapp werden -> größer gehen */
9
      ultoa( za, Buffer, 10 );
10
      set_cursor(0,1);
11
      lcd_string( Buffer );

Die Funktionsnamen sind nach einem Schema aufgebaut. In der Mitte steht 
jeweils 'to' um anzuzeigen, dass etwas konvertiert wird. Das 'a' hinten 
bedeutet ASCII, also Text. Und vorne steht ein Kürzel für den Datentyp

   itoa     integer to ascii
   utoa     unsigned integer to ascii
   ltoa     long to ascii
   ultoa    unsigned long to ascii


Wie gesagt, du brauchst dringend ein Buch!

von dunial (Gast)


Lesenswert?

Hallo,

ich darf verkünden: es klappt !!

Vielen Dank noch einmal für eure Bemühungen.
Nach einem Buch werde ich mich einmal umsehen. Ich habe nur momentan 
eines, dass im Speziellen die Controller der Atmel-Mega-Serie behandelt. 
Da gibt es auch Codebeispiele und Anwendungen, aber eben nicht für so 
einen Zähler.

Viele Grüße
Daniel

von Karl H. (kbuchegg)


Lesenswert?

dunial schrieb:
> Hallo,
>
> ich darf verkünden: es klappt !!
>
> Vielen Dank noch einmal für eure Bemühungen.
> Nach einem Buch werde ich mich einmal umsehen. Ich habe nur momentan
> eines, dass im Speziellen die Controller der Atmel-Mega-Serie behandelt.
> Da gibt es auch Codebeispiele und Anwendungen, aber eben nicht für so
> einen Zähler.

Du brauchst ein Grundlagenbuch für C!

Ein Buch über die speziellen Formgebungen des Brennraums und dessen 
Auswirkungen auf den Wirkungsgrad hilft dir nichts oder nur wenig, wenn 
dein Problem darin besteht, wie so ein Ottomotor eigentlich 
funktioniert. Klar kann man sich das eine oder andere aus dem 
Spezialbuch zusammenreimen. Aber es wird immer ein Zusammenreimen 
bleiben und nie etwas Handfestes werden!

von Karl H. (kbuchegg)


Lesenswert?

Ich hab dein Programm mal etwas bearbeitet.
Es entspricht der Funktionalität nicht ganz deinem Programm. ABer es 
soll dir zeigen, wie man sich durch die Einführung von Funktionen den 
Code in kleinere überschaubarere Einheiten zergliedern kann.
1
#include "lcd_routine.h"
2
//#include <avr/eeprom.h>
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <avr/signal.h>
6
#include <util/delay.h>
7
#include "string.h"
8
9
#define RST_PIN PC1
10
#define T1 PC5
11
#define T2 PC4
12
#define T3 PC3
13
#define SigE PD5
14
#define GET(PORT,PIN) (!((PORT)&(1<<(PIN))))
15
16
//Strings im EEPROM
17
/*unsigned char StartbildZ1[] EEMEM = "Geigerz\xE1hler";
18
unsigned char StartbildZ2[] EEMEM = "mit VA-Z-310";
19
unsigned char PrgauswahlZ1[] EEMEM = "Zum Starten ein";
20
unsigned char PrgauswahlZ2[] EEMEM = "Programm w\xE1hlen";
21
unsigned char Prg1Z1[] EEMEM = "Programm 1:";
22
unsigned char Prg1Z2[] EEMEM = "1 Minute messen";
23
unsigned char Prg2Z1[] EEMEM = "Programm 2:";
24
unsigned char Prg2Z2[] EEMEM = "30 Sek. messen";
25
unsigned char Prg3Z1[] EEMEM = "Programm 3:";
26
unsigned char Prg3Z2[] EEMEM = "10 Sek. messen";
27
unsigned char Einheit[] EEMEM = "ySv/h";
28
unsigned char DP[] EEMEM = ".";
29
unsigned char Neustart[] EEMEM = "Neustart Messung";
30
unsigned char Zeit1[] EEMEM = "1 Minute";*/
31
32
//Laufvariabeln
33
unsigned char t0;  //Variable t0 (Wert Timer0)
34
unsigned long zg;  //Variable zg (Wert Gesamtstand Timer1 nach �berlauf)
35
unsigned long za;  //Variable za (Wert zur Ausgabe durch das LCD)
36
unsigned long z1;  //Variable z1 bis zum 1.�berlauf Timer1
37
38
//Zeitvariable
39
volatile unsigned int  sekunde;
40
41
//////////////////////////////////////////////////////////////////////
42
SIGNAL(SIG_INTERRUPT0)  //Interrupt f�r Timer0-�berlauf
43
{
44
  sekunde++;      //Wert der Variablen 'sekunde' um 1 erh�hen
45
}
46
47
//////////////////////////////////////////////////////////////////////
48
void lcd_header( const char* pgm_name, const char* time_String )
49
{
50
  lcd_clear();
51
52
  set_cursor( 1, 1 );
53
  lcd_string( pgm_name );
54
55
  set_cursor( 1, 2 );
56
  lcd_string( time_String );
57
58
  _delay_ms(500);
59
}
60
61
//////////////////////////////////////////////////////////////////////
62
void lcd_utoa( unsigned int zahl )
63
{
64
  char Buffer[8];
65
  utoa( zahl, Buffer, 10 );
66
  lcd_string( Buffer );
67
}
68
69
//////////////////////////////////////////////////////////////////////
70
void lcd_ultoa( unsigned long zahl )
71
{
72
  char Buffer[14];
73
  utoa( zahl, Buffer, 10 );
74
  lcd_string( Buffer );
75
}
76
77
//////////////////////////////////////////////////////////////////////
78
void messung( unsigned int messzeit )
79
{
80
  lcd_clear();
81
  set_cursor(7,1);
82
  lcd_data('.');  //setzten des Dezimalpunktes
83
  set_cursor(11,1);
84
  lcd_string("ySv/h");
85
86
                  //unsigned char t0;  Variable t0 (Wert Timer0)
87
                  //unsigned long zg;  Variable zg (Wert Gesamtstand Timer1 nach �berlauf)
88
                  //unsigned long za;  Variable za (Wert zur Ausgabe durch das LCD)
89
  t0 = 0;        //Variable t0 (Wert Timer0) wird auf null gesetzt
90
  zg = 0;        //Variable zg (Wert Gesamtz�hlstand) wird auf null gesetzt
91
  za = 0;        //Variable za (Wert Zahlausgabe LCD) wird auf null gesetzt
92
  sekunde = 0;   //Zeitvariable auf null gesetzt
93
94
  TCNT0  = 0;     //Anfangswert Timer0 ist null
95
  TCCR0 |= 0x03;  //Timer0 wird gestartet; Teiler 011 Systemtakt :64
96
97
98
                  //unsigned long z1;  Variable z1 bis zum 1.�berlauf Timer1
99
  z1 = 0;         //Variable z1 (Wert Z�hlregister TCNT1 von Timer1) wird auf null gesetzt
100
101
  TCCR1A = 0;     //kein Compare- und/oder PWM-Betrieb
102
  OCR1A  = 0;
103
  OCR1B  = 0;
104
  TCNT1  = 0;     //Z�hlregister Timer1 wird auf null gesetzt
105
  TCCR1B = 0x07;  //Timer1 wird gestartet; am PinT1(PD5) werden steigende Flanken erkannt
106
107
  do {
108
    z1 = TCNT1;    //Variable z1 nimmt den Wert des Z�hlregisters TCNT1 von Timer1 an
109
110
    if( z1 >= 50000 )  //ist Timer1 >= 50.000 ?
111
    {              //TCNT1L>=0x50,TCNT1H>=0xc3
112
      z1 = zg;
113
      zg = 50000;
114
    }
115
      
116
    za = z1 + zg;
117
    set_cursor( 0, 1 );
118
    lcd_ultoa( za );
119
120
  } while( sekunde < messzeit );
121
122
  TCCR0 = 0;
123
  TCNT0 = 0;
124
  TCCR1B = 0x00;    //Timer1 stopp
125
}
126
127
//////////////////////////////////////////////////////////////////////
128
void miss_60_sekunden()
129
{
130
  lcd_header( "Programm 1:", "1 Minute messen");
131
  messung( 60 );
132
}
133
134
//////////////////////////////////////////////////////////////////////
135
void miss_30_sekunden()
136
{
137
  lcd_header( "Programm 2:", "30 Sek. messen");
138
  messung( 30 );
139
}
140
141
//////////////////////////////////////////////////////////////////////
142
void miss_10_sekunden()
143
{
144
  lcd_header( "Programm 3:", "10 Sek. messen");
145
  messung( 10 );
146
}
147
148
//////////////////////////////////////////////////////////////////////
149
int main (void)  
150
{
151
  DDRB = 0xff;    //Pins PortB sind alles Ausg�nge
152
  PORTB = 0x00;  
153
  DDRC = 0x00;    //Pins PortC sind alles Eing�nge
154
  PORTC |= (1 << T3) | (1 << T2) | (1 << T1) | (1<<RST_PIN);  //internen Pull-Up f�r PC1, PC3 bis PC5 aktivieren
155
  DDRD = 0xff;    //Pins PortD sind alles Ausg�nge
156
  DDRD &= ~(1 << SigE);//Pin1 auf Eingang und andere im urspr�nglichen Zustand belassen
157
158
  lcd_init();
159
  lcd_clear();
160
  set_cursor(2,1);
161
  lcd_string("Geigerz\xE1hler");
162
163
  set_cursor(2,2);
164
  lcd_string("mit VA-Z-310");
165
  _delay_ms(600);
166
  lcd_clear();
167
168
  while(1)    //Anfang Programmschleife
169
  {
170
    set_cursor(0,1);
171
    lcd_string("Zum Starten ein");
172
    set_cursor(0,2);
173
    lcd_string("Programm w\xE1hlen");
174
    _delay_ms(50);
175
176
    if (GET(PINC,T1))
177
    {
178
      miss_60_sekunden();
179
    }
180
181
    else if (GET(PINC,T2))
182
    {
183
      miss_30_sekunden();
184
    }
185
186
    else if (GET(PINC,T3))
187
    {
188
      miss_10_sekunden();
189
    }
190
  }  //Ende Programmschleife
191
}  //Ende main

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.