INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Interupt timer 4x7 Segement Display und Serial read
18.09.2014, 12:18
Beitrag #1
Interupt timer 4x7 Segement Display und Serial read
Moinsen,

ich habe eigentlich schon das Problem erkannt, aber keinen Schimmer wie ich es rauscodiere. Ich nutze ein 4x7 Segment Display und Multiplexe. Nun möchte ich "nebenher" RFID Tags auslesen und daher die Serialschnittstelle nutzen. Ich bekomme jedoch nur Datenmüll, da, so wie ich es verstanden habe (Netzrecherche) hier durch das Multiplexing der Interupttimer mit dem Serial auslesen im Konflikt steht. Kann ich den Timer kurz aussetzen, das Tag ausslesen und dann wieder starten??? Wenn ja wie?Huh Achso ich bin ein Samplecodekopierer... Big GrinUndecided

Code:
#line 1 "sketch_sep09a.ino"
#include "Arduino.h"
#include <SoftwareSerial.h>

SoftwareSerial RFID(0, 1); // RX and TX

const int clock = 7; //SCK
const int latch = 5; //RCK
const int data = 6;  //DIO

byte value[] ={
                B11000000, // 0
                B11111001, // 1
                B10100100, // 2
                B10110000, // 3
                B10011001, // 4
                B10010010, // 5
                B10000010, // 6
                B11111000, // 7
                B10000000, // 8
                B10010000, // 9
                B11111111};// display nothing

byte digit[] ={ B00000001, // left segment
                B00000010,
                B00000100,
                B00001000,
                B00010000,
                B00100000,
                B01000000,
                B10000000}; // right segment
                
byte valued[] ={ B01000000, // 0.
                 B01111001, // 1.
                 B00100100, // 2.
                 B00110000, // 3.
                 B00011001, // 4.
                 B00010010, // 5.
                 B00000010, // 6.
                 B01111000, // 7.
                 B00000000, // 8.
                 B00010000, // 9.
                 B11111111};// display nothing

byte ii = 0;

byte v0, v1,v2,v3,v4,v5,v6,v7;
byte vvalue = value[0];

void setup() {
  
  RFID.begin(4800);    // start serial to RFID reader
  Serial.begin(9600);  // start serial to PC
  
  pinMode(clock, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);

  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter value to 0
  OCR0A = 255;//(must be  16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts

  v0=v1=v2=v3=v4=v5=v6=v7=10; // default: show nothing
  
}

ISR(TIMER0_COMPA_vect){  
  ii++;
  if (ii==8) ii=0; // wenn alle Stellen (digits) Z\u00e4hler zur\u00fccksetzen

  if (ii==0) { vvalue = v0; }
  else if (ii==1) { vvalue = v1; }    
  else if (ii==2) { vvalue = v2; }
  else if (ii==3) { vvalue = v3; }
  else if (ii==4) { vvalue = v4; }
  else if (ii==5) { vvalue = v5; }
  else if (ii==6) { vvalue = v6; }
  else if (ii==7) { vvalue = v7; }

  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,B11111111);
  shiftOut(data,clock,MSBFIRST,B11111111);
  digitalWrite(latch,HIGH);

  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,digit[ii]);
  if ( (ii==0) || (ii==2) ||(ii==4) || (ii==6) )
    shiftOut(data,clock,MSBFIRST,valued[vvalue]);
  else
    shiftOut(data,clock,MSBFIRST,value[vvalue]);
  digitalWrite(latch,HIGH);  
}


int tag1[12] = {32,48,52,49,56,53,58,51,61,55,57,32};
int tag2[12] = {32,48,52,49,56,53,58,51,52,50,53,32};
int newtag[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; // used for read comparisons
int rfiddata = 0;

int zeit = 0;
int zeita = 0;
int zeitb = 0;
int t = 100; //ms 100ms = 1 zehntel Sekunde


// 1 ms = 0,001s; 100ms = 0,1s

void loop() {// loop Dauerschleife!!!

  delay(t);  //ms
  
  if (RFID.available() > 0) {
    
    delay(t);  //ms Zeit zum Datenempfang
    
    for (int z = 0 ; z < 12 ; z++) // read the rest of the tag
    {
      rfiddata = RFID.read();
      newtag[z] = rfiddata;
      
    }
    
    RFID.flush(); // stops multiple reads
    Serial.print(newtag[0], DEC);
    Serial.print(newtag[1], DEC);
    Serial.print(newtag[2], DEC);
    Serial.print(newtag[3], DEC);
    Serial.print(newtag[4], DEC);
    Serial.print(newtag[5], DEC);
    Serial.print(newtag[6], DEC);
    Serial.print(newtag[7], DEC);
    Serial.print(newtag[8], DEC);
    Serial.print(newtag[9], DEC);
    Serial.print(newtag[10], DEC);
    Serial.print(newtag[11], DEC);
    Serial.println("");
  }
  

  
    if ((comparetag(newtag, tag1) == true) && (zeita<6000)) {
      zeita++; //10zeit = 10*100ms = 1s .... 10 sek = ((10*t)*10)
      
      int zs = zeita % 10; //zehntelsekunde zeita<=9
      int s1 = zeita / 10 % 10; //Sekunde einerstelle zeita<=99
      int s2 = zeita / 100; s2 = s2 % 6; //sekunde zehnerstelle zeita<=999
      int m1 = zeita * 1.6667*0.001; //minute einstelle
          
      v0 = m1; // Minuten
      v1 = s2; // zehnersekunde
      v2 = s1; // sekunde
      v3 = zs; // milisekunden
    }
  
    if ((comparetag(newtag, tag2) == true) && (zeitb<6000)) {
      zeitb++; //10zeit = 10*100ms = 1s .... 10 sek = ((10*t)*10)
      
      int zs = zeitb % 10; //zehntelsekunde zeitb<=9
      int s1 = zeitb / 10 % 10; //Sekunde einerstelle zeitb<=99
      int s2 = zeitb / 100; s2 = s2 % 6; //sekunde zehnerstelle zeitb<=599
      int m1 = zeitb * 1.6667*0.001; //minute einstelle
          
      v4 = m1; // Minuten
      v5 = s2; // zehnersekunde
      v6 = s1; // sekunde
      v7 = zs; // milisekunden
    }

zeit++;  
}

boolean comparetag(int aa[12], int bb[12])
{
  boolean ff = false;
  int fg = 0;
  for (int cc = 0 ; cc < 12 ; cc++)
  {
    if (aa[cc] == bb[cc])
    {
      fg++;
    }
  }
  if (fg == 12)
  {
    ff = true;
  }
  return ff;
}

  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  matrix display elegoo uno R3 starter set lecker16 7 134 23.11.2016 21:14
Letzter Beitrag: Bitklopfer
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 88 12.11.2016 20:29
Letzter Beitrag: Hannes
  Countdown Timer Uwe1475 23 725 19.10.2016 18:33
Letzter Beitrag: Uwe1475
  Speicher sparen bei serial.print?? DL1AKP 3 193 02.09.2016 13:32
Letzter Beitrag: hotsystems
  Serial Monitor ASCII 1 schreiben BennIY 11 575 01.08.2016 16:42
Letzter Beitrag: Mathias
  Serial.write Mathias 6 377 29.07.2016 17:06
Letzter Beitrag: Mathias
  LCD Display plötzlich komische Zeichen Jessi97 2 240 28.07.2016 11:34
Letzter Beitrag: Bitklopfer
  Altes Digitales Display mit Text/Bits durch Genuino Micro versorgen - SPI-Bibliothek? RollingStone 0 202 25.06.2016 17:46
Letzter Beitrag: RollingStone
  (Mega) Timer 3 A, B & C Scheams 0 227 04.06.2016 17:09
Letzter Beitrag: Scheams
  Serial Monitor Rudi 5 628 02.06.2016 11:37
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste