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
  Timer lernen AnjinSan 14 186 26.06.2017 13:25
Letzter Beitrag: Tommy56
  Array mit Serial.read befüllen Gonmaus 4 342 01.05.2017 09:13
Letzter Beitrag: Gonmaus
  Münzeinwurf mit Timer KBLc 11 541 26.04.2017 21:21
Letzter Beitrag: KBLc
  serial monitor, Ausgabe übereinander möglich?? silversurfer123 4 233 18.04.2017 19:19
Letzter Beitrag: silversurfer123
  Brauche Zeitverzögerung delay/millis/timer? Spiecky 17 733 15.04.2017 09:41
Letzter Beitrag: hotsystems
  Waveform auf Nextion Display GuaAck 6 392 12.04.2017 19:08
Letzter Beitrag: SkobyMobil
  Interrupt und Software Serial BennIY 6 388 29.03.2017 22:25
Letzter Beitrag: BennIY
  neues OLED Display nötig an vorhandenem uC Systemswerlich Ersatz hd311 7 249 26.03.2017 11:16
Letzter Beitrag: hd311
  Pinbelegung TFT-Display ILI9341 mingo 19 763 23.03.2017 17:49
Letzter Beitrag: oOSpikeOo
  RGB Animation über Serial Steuern Medolino 5 294 20.02.2017 16:14
Letzter Beitrag: Medolino

Gehe zu:


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