stm32f0 discovery morse code intrepeter ledjes vraag

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • jackneedshelp
  • Registratie: Maart 2024
  • Laatst online: 02-03-2024
Mijn vraag
ik probeer een morse code intrepeter te maken waarbij je in keill uvision codeer app voor de stm32 een programma runt en de putty opent een 3 letter woord in toetst en dan de morse code terug krijg dat werkt tot nu toe, maar nu wil ik de lampjes laten branden door middel van de . of - die in de morse terug komt in een interrupt van timer 2.

daarna wil ik het zelfde doen met geluid maar eerst de ledjes, ik ga nu in de interrupt vanuit het verwerken, doormiddel van een switch case.

Relevante software en hardware die ik gebruik
de hardware die ik gebruik is de stm32f0 discovery een mini amplyfyer speaker, een ledje pc8 op de stm32 zelf en potentiometer.

Wat ik al gevonden of geprobeerd heb
ik heb al zo veel geprobeerd, maar het werkt niet

dit is de timer interrupt

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
const uint8_t DOT_DURATION = 1;
const uint8_t DASH_DURATION = 3;
const uint8_t SYMBOL_PAUSE = 1;
const uint8_t LETTER_PAUSE = 3;
const uint8_t WORD_PAUSE = 7;


void TIM2_IRQHandler(void) {
    // Check if the update interrupt flag is set
        //PC8_ON(); //test interupt
        //USART_Putstr("Interrupt\n");
    
    if (TIM2->SR & TIM_SR_UIF) {
        // Clear the update interrupt flag
        TIM2->SR &= ~TIM_SR_UIF;
            
                //PC8_ON(); //test interupt
        // Morse code interpretation logica
                    //if (newDataAvailable) {
            // Verwerk de data alleen als er nieuwe data beschikbaar is
            switch (morseState) {
                case 0:
                                    if (newDataAvailable) {
                    USART_Putstr("case 0 - Wacht op data\n");
                    // Verwerk de data hier...
                    newDataAvailable = false; // Reset flag na verwerking
                                break;
                    
            case 1:  // Dot
                            USART_Putstr("case1\n\n");
                // Turn on the LED (PC8) for the Dot duration
                PC8_ON();
                // Set the new auto-reload value for the timer based on the Morse code duration
                TIM2->ARR = DOT_DURATION * speedFactor * PRESCALER - 1;
                break;

            case 2:  // Pause between Dash and Next Element and between Dot and Dash
                USART_Putstr("case 2\n\n");
                        // Turn off the LED
                PC8_OFF();
                // Set the new auto-reload value for the timer based on the pause duration
                TIM2->ARR = SYMBOL_PAUSE * speedFactor * PRESCALER - 1;
                break;

            case 3:  // Dash
                            USART_Putstr("case 3\n\n");
                // Turn on the LED (PC8) for the Dash duration
                PC8_ON();
                // Set the new auto-reload value for the timer based on the Morse code duration
                TIM2->ARR = DASH_DURATION * speedFactor * PRESCALER - 1;
                break;
                        
            case 4:  // letter 
                                //PC8_ON();
                                USART_Putstr("case 4\n\n");
                // Set the new auto-reload value for the timer based on the pause duration
                TIM2->ARR = LETTER_PAUSE * speedFactor * PRESCALER - 1;
                                // Turn off the LED
                PC8_OFF();
                break;

            case 5:  // Pause between Words
                                USART_Putstr("case 5\n\n");
                // Turn off the LED
                PC8_OFF();
                // Set the new auto-reload value for the timer based on the word pause duration
                TIM2->ARR = WORD_PAUSE * speedFactor * PRESCALER - 1;
                break;

            default:  // Do nothing for other states
                break;
        }
    }
    }
    // Als er geen meer data is om te verwerken
    morseState = 0; // Ga terug naar de wachtstatus of een andere logische beginstatus
    newDataAvailable = false; // Reset de flag omdat we wachten op nieuwe data
}


C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    void Transform_inputChar_to_output(void) {
    int i,j;
    char input, output;

    for (j = 0; RxBuffer[j] != '\0'; j++) {
        input = RxBuffer[j];
        output = morseBuffer[morseWriteIndex];

        // Stop als de buffer vol is
        if ((morseWriteIndex + 1) % MORSE_BUFFER_SIZE == morseReadIndex) {
            return;
        }

        //test of buffer wordt verwerkt
        USART_Putstr("input: ");
        USART_Putstr(&input);
        USART_Putstr("\n");

        // Check if the input is a valid letter
        if ((input >= 'A' && input <= 'Z')) {
            // Lookup Morse code for the input letter
            const char* morseCode = morsealfabet[input - 'A'];

            // Process Morse code and fill the buffer
            for (i = 0; morseCode[i] != '\0'; i++) {
                            newDataAvailable = true;
                            
                if (morseCode[i] == '.') {
                    morseBuffer[morseWriteIndex++] = DOT_DURATION;
                                        morseState = 1; //gaat naar case 0 in it.c
                } else if (morseCode[i] == '-') {
                    morseBuffer[morseWriteIndex++] = DASH_DURATION;
                                        morseState = 3; // gaat naar case 2 in it.c
                }
                morseBuffer[morseWriteIndex++] = SYMBOL_PAUSE;
                                morseState = 2; //gaat naar case 1 in it.c
            }

            // Add a pause between letters
            morseBuffer[morseWriteIndex++] = LETTER_PAUSE;
                        morseState = 4;

            USART_Putstr("morse: ");
            USART_Putstr((char*)morseCode);
            USART_Putstr("\n");

        } else if (input >= 'a' && input <= 'z') {
            // Lookup Morse code for the input letter
            const char* morseCode = morsealfabet[input - 'a'];

            // Process Morse code and fill the buffer
            for (i = 0; morseCode[i] != '\0'; i++) {
                            newDataAvailable = true;
                if (morseCode[i] == '.') {
                    morseBuffer[morseWriteIndex++] = DOT_DURATION;
                                        morseState = 1;
                } else if (morseCode[i] == '-') {
                    morseBuffer[morseWriteIndex++] = DASH_DURATION;
                                    morseState = 3;
                }
                morseBuffer[morseWriteIndex++] = SYMBOL_PAUSE;
                                morseState = 2;
            }

            // Add a pause between letters
            morseBuffer[morseWriteIndex++] = LETTER_PAUSE;
                        morseState = 4;

            USART_Putstr("morse: ");
            USART_Putstr((char*)morseCode);
            USART_Putstr("\n");
                        
        }

        // Reset read index if necessary
        if (morseWriteIndex != morseReadIndex) {
            morseReadIndex = (morseReadIndex + 1) % MORSE_BUFFER_SIZE;
        }
                //morseState = 0;
    }

    USART_Putstr("\n");
}

[ Voor 82% gewijzigd door RobIII op 02-03-2024 23:04 . Reden: Syntax highlighting ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • xFeverr
  • Registratie: Juni 2011
  • Laatst online: 17-09 15:54
Begin eerst eens met de hele boel tussen code-tags te zetten, want nu is alle indenting weg en niet te lezen.

Acties:
  • 0 Henk 'm!

  • jackneedshelp
  • Registratie: Maart 2024
  • Laatst online: 02-03-2024
@xFeverr bedankt voor de tip ik heb de post aangepast

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
offtopic:
Nog beter als je met [code=c] begint.

Het is best wat code, welk stuk code is meest relevant voor je vraag; waar stoei je het meest mee?

{signature}


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
@jackneedshelp Wanneer je code post, beperk je dan a.u.b. tot relevante(!) stukjes code; we zitten hier niet om complete lappen code te gaan bekijken. En als we vragen wat je al geprobeerd hebt, dan willen we dat ook graag weten en is dus het antwoord niet 'zoveel maar het werkt niet'. Wat heb je dan geprobeerd, wat heb je gezocht en gevonden en wat werkt er niet, welke foutmelding(en) krijg je etc.? ;) Neem even onze Quickstart door mocht je daar nog niet bekend mee zijn. Ik zou graag zien dat je je topicstart even aanpast met voorbenoemde punten in je achterhoofd :)

[ Voor 21% gewijzigd door RobIII op 02-03-2024 23:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Probeer een beetje een schrijfconventie aan te houden, ik zie snakecasing en camelcasing... En een functie die met een hoofdletter begint ;)

i3 + moederbord + geheugen kopen?

Pagina: 1