Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-rtos mbed CRC16
Fork of S5info_APP2 by
Revision 13:a436ba0b78e8, committed 2017-03-07
- Comitter:
- JoeyDionne
- Date:
- Tue Mar 07 04:37:39 2017 +0000
- Parent:
- 12:a55f77a0e188
- Child:
- 15:7c2e70c36b98
- Child:
- 21:73db1bea19b1
- Commit message:
- Ajout de l'?criture
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Tue Mar 07 02:12:21 2017 +0000
+++ b/main.cpp Tue Mar 07 04:37:39 2017 +0000
@@ -6,7 +6,8 @@
const float HALF_PERIOD = 0.05; // secondes
Serial pc(USBTX, USBRX, 9600);
-Serial uart(p13, p14, 9600);
+DigitalIn in(p14);
+DigitalOut out(p13);
Thread ThreadLecture;
bool transmit = false; //faux pour le debut de demi-periode d'envoie d'un bit, vrai pour la 2ème demi-periode
@@ -16,19 +17,19 @@
trame_length; //longueur de la trame complete
//test
-bool bIsHalfPeriod = false;
+bool clockTick = false;
extern "C" void RIT_IRQHandler(void) {
//clear flag
LPC_RIT->RICTRL |= bit0; //write 1 to clear bit
- bIsHalfPeriod = !bIsHalfPeriod;
+ //bIsHalfPeriod = !bIsHalfPeriod;
}
void p14_interrupt()
{
// On turn off les interrupts de lecture une fois qu'on a détecter un message
- uart.attach(NULL, uart.RxIrq);
+ //uart.attach(NULL, uart.RxIrq);
// On envoie le signal au thread de lecture
ThreadLecture.signal_set(1);
@@ -39,98 +40,119 @@
while(true)
{
// Attente passive d'un message entrant
- uart.attach(&p14_interrupt, uart.RxIrq);
+ //uart.attach(&p14_interrupt, uart.RxIrq);
ThreadLecture.signal_wait(1);
// Lis le message. Retourne une exception si il y a une erreur
- vector<char> message = uart_read(uart);
+ //vector<char> message = uart_read(uart);
- if (!message.empty())
- {
+ //if (!message.empty())
+ //{
// Affiche le message à l'écran
- pc.printf(&message[0], message.size());
- }
+ //pc.printf(&message[0], message.size());
+ //}
}
};
void rit_init()
{
- LPC_SC->PCONP |= bit16; //Power Control for Peripherals register: power up RIT clock
- LPC_SC->PCLKSEL1 |= (bit26 && bit27); //Peripheral clock selection: divide clock by 8 (run RIT clock by 12.5MHz)
- LPC_RIT->RICOUNTER = 0; //set counter to zero
- LPC_RIT->RICOMPVAL = 250000000 * HALF_PERIOD; //interrupt tick every HALF_PERIOD
- LPC_RIT->RICTRL |= bit1; // clear timer when counter reaches value
- LPC_RIT->RICTRL |= bit3; // enable timer
-
- //enable interrupt
- NVIC_SetPriority(RIT_IRQn, 31);
- NVIC_EnableIRQ(RIT_IRQn);
+ //Timer 1 (match)
+ LPC_SC->PCLKSEL0 |= (1 << 4); // pclk = cclk timer1
+ LPC_SC->PCONP |= (1 << 2); // timer1 power on
+ LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100; // 10 ms
+ LPC_TIM1->MCR = 3; // interrupt and reset control
+ // Interrupt & reset timer on match
+ LPC_TIM1->EMR = (3 << 4);
+ NVIC_EnableIRQ(TIMER1_IRQn); // enable timer interrupt
+ LPC_TIM1->TCR = 1; // enable Timer
+
+ //Timer 2 (cap)
+ LPC_SC->PCLKSEL1 |= (1 << 12); // pclk = cclk timer2
+ LPC_SC->PCONP |= (1 << 22); // timer2 power on
+ LPC_TIM2->TC = 0; // clear timer counter
+ LPC_TIM2->PC = 0; // clear prescale counter
+ LPC_TIM2->PR = 0; // clear prescale register
+ LPC_TIM2->TCR |= (1 << 1); // reset timer
+ LPC_TIM2->TCR &= ~(1 << 1); // release reset
+ LPC_TIM2->IR = 0xFFFFFFFF; // clear interrupt register
+ LPC_TIM2->CCR |= 0x0000007; // enable rising-edge and falling-edge capture on 2.0
+ NVIC_EnableIRQ(TIMER2_IRQn); // enable timer interrupt
+ LPC_TIM2->TCR = 1; // start Timer
};
+bool codeManchester(bool bit, bool clock)
+{
+ return (bit == clock);
+}
+
void send_data()
{
- if (!transmit) { //Si on est dans la premiere demi-periode d'envoie
- if (((trame_sent[byte_sent_pos] >> bit_sent) & 0x01) == 1) { //Verifier le bit à envoyer et preparer la prochaine interruption pour prendre sa valeur
- LPC_RIT->EMR |= 1 << 5;
- LPC_RIT->EMR &= ~(1 << 4);
- } else {
- LPC_RIT->EMR |= 1 << 4;
- LPC_RIT->EMR &= ~(1 << 5);
- }
- } else { //Si on est dans la 2eme demi-periode d'envoie, toggle a la prochaine interruption
- LPC_RIT->EMR |= 3 << 4;
+ out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), clockTick); // Encodage Manchester
+ if(clockTick)
+ {
bit_sent--;
}
- transmit = !transmit; //varier entre la 1ere et 2eme partie de demi-periode
- LPC_RIT->MR0 += HALF_PERIOD; //preparer la prochaine interruption a une demi-periode plus loin
+ clockTick = !clockTick; //varier entre la 1ere et 2eme partie de demi-periode
if (bit_sent < 0) { //Si l'octet a ete envoye
bit_sent = 7; //remettre la position initiale pour le prochain octet
byte_sent_pos++; //incrementer l'octet
- if (byte_sent_pos > trame_length) { //Si la trame a ete envoyee
- LPC_RIT->MCR &= 0; //desactiver les interruptions du MAT
- LPC_RIT->EMR &= ~(3 << 4); //remettre a zero le registre EMR (00 pour rien faire, 01 pour mettre a 1, 10 pour mettre a 0 et 11 pour toggle)
+ if (byte_sent_pos >= trame_length) { //Si la trame a ete envoyee
byte_sent_pos = 0;
- transmit = false;
+ clockTick = false;
}
}
}
-void get_text()
+//création de la trame
+void create_trame(char message[],int taille)
{
CRC16 *myCRC = new CRC16();
+ unsigned short resultCRC = myCRC->calculateCRC16(message,taille);
trame_sent[0] = 0x55; //Preambule
trame_sent[1] = 0x7E; //Start
trame_sent[2] = 0x00; //Type + Flag mis a 0x00
+ trame_sent[3] = (char)taille; //Longueur du message (Max 33 caractères)
+ //message
+ for (int i=0;i<taille;i++)
+ {
+ trame_sent[taille + 4] = message[i];
+ }
+
+ //CRC16
+ trame_sent[taille + 4] = (resultCRC >> 8) & 0xFF;
+ trame_sent[taille + 5] = resultCRC & 0xFF;
+
+ trame_sent[taille + 6] = 0x7E; //End
+ trame_length = taille + 7; //Longueur de la trame
+}
+
+//obtention du texte
+void get_text()
+{
pc.printf("\n\rYour text : ");
int count = 0;
char c = 0x00;
char text[73];
- while(c != 0x0D && count < 73) { //Tant que c'est different de '\r' et un maximum de 33 caractères
+ while(c != 0x0D && count < 73) { //Tant que c'est different de '\r' et pour un maximum de 73 caractères
c = pc.getc();
- trame_sent[count + 4] = c; //Ajouter les caractères tapés au clavier dans le message
text[count] = c;
pc.putc(c);
count++;
}
- trame_sent[3] = (char)count; //Longueur du message (Max 33 caractères)
- unsigned short resultCRC = myCRC->calculateCRC16(text,count);
- trame_sent[count + 4] = (resultCRC >> 8) & 0xFF;
- trame_sent[count + 5] = resultCRC & 0xFF;
-
- trame_sent[count + 6] = 0x7E; //End
- trame_length = count + 6; //Longueur de la trame
-
+ create_trame(text,count);
}
void write()
{
byte_sent_pos = 0;
bit_sent = 7;
- LPC_RIT->MCR = 1; //Permettre les interruption du MAT
- LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD; //Faire une interruption a la prochaine demi-periode
+ clockTick = false;
+ //TODO start interrupt timer 1
+ //LPC_RIT->MCR = 1; //Permettre les interruption du MAT
+ //LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD; //Faire une interruption a la prochaine demi-periode
}
int main() {
