Guten Tag , Ich versuche zur Zeit ein Projekt zu machen mit dem STM32 und zwar ein Glückspiel , vershiedene Digits werden auf x4 7 Segmente angezeigt werden und deshalb spielt das Multiplexen hier eine große Rolle , ich versuche in dieser Zeit 4 verschiedene zahlen darzustellen aber ich schaffe es leider nicht , wenn ich irgendwas representieren möchte , dann leuchtet nur das gemeinsame Segment , BSP 1 2 3 4 , leuchtet nur das segment b . Jetzt bin ich in eine komplette Verwirrung weil ich keine ahnung habe , ob die fehler in der Schaltung oder im Code steht , ich werde mein kommentiertes Code und die Schaltung mitteilen ich danke euch im voraus für die Hilfe Schaltung : http://www.fritzler-avr.de/HP/tipps/multi.php?fbclid=IwAR1UdwD8ZZOsQBqIGddm1tAAg14yaTb0xf6kFRXDe1pF8iJZ_Onk6Fyse2I Gleiches Prinzip 4 Basis gehen aber zur ports des prozessors . Emmiter zur VCC und Kollektor zur Common anodes die Ports werden zusammen verbunden dann zur ports . Code : #include "stm32f3xx.h" #include <stdint.h> void activation(); void showdigit (int digit); void showdigits1 (int number); void showdigits2 (int number); void showdigits3 (int number); void showdigits4 (int number); void delay(unsigned int x); void mode1 () ; void mode2 () ; void mode3 () ; void mode4 () ; int main(void){ int x = 1234 ; activation() ; for(;;){ mode1() ; showdigits1(x); delay(1000); mode2() ; showdigits2(x); delay(1000); mode3() ; showdigits3(x); delay(1000); mode4(); showdigits4(x); delay(1000); } } //Delay function volatile _Bool finished; void delay(unsigned int x){ finished = 0; RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2->DIER = TIM_DIER_UIE; // Update-Interrupt ein TIM2->CNT = 0; TIM2->PSC = 7999; // Zaehltakt: 1 ms TIM2->ARR = x - 1; TIM2->CR1 = TIM_CR1_CEN; // Timer ein NVIC_EnableIRQ(TIM2_IRQn); while (!finished) __WFI(); TIM2->CR1 = 0; return; } void TIM2_IRQHandler(void) { finished = 1; TIM2->SR &= ~TIM_SR_UIF; } // end Delay Function // Begin digitsfrom 0 void activation(){ RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // activation PORTS A RCC->AHBENR |= RCC_AHBENR_GPIOBEN; // activation PORTS B RCC->AHBENR |= RCC_AHBENR_GPIOCEN; // activation PORTS C GPIOA->MODER |= 0b01 << 0; // segment d GPIOA->MODER |= 0b01 << 2; // segment f GPIOA->MODER |= 0b01 << 8; // segment e GPIOA->MODER |= 0b01 << 16 ; // segment c GPIOB->MODER |= 0b01 << 0; // segment g GPIOC->MODER |= 0b01 << 2; // segment a GPIOC->MODER |= 0b01 << 0; // segment b GPIOB->MODER |= 0b01 << 20; // t1 GPIOB->MODER |= 0b01 << 10; // t2 GPIOB->MODER |= 0b01 << 12; // t3 GPIOA->MODER |= 0b01 << 18 ; // t4 } /* PORTS DESCIPTION Segment a PC1 Segment b PC0 Segment c PA8 Segment d PA0 Segment e PA4 Segment f PA1 Segment g PB0 */ // 0 is active emmeter => +VCC void digit0 (){ // 0 GPIOB->ODR |= (1<<0); } void digit1 (){// 1 GPIOC->ODR |= (1<<1); GPIOA->ODR |= (1<<1); GPIOB->ODR |= (1<<0); GPIOA->ODR |= (1<<4); GPIOA->ODR |= (1<<0); } void digit2 (){// 2 GPIOA->ODR |= (1<<8); GPIOA->ODR |= (1<<1); } void digit3 (){// 3 GPIOA->ODR |= (1<<4); GPIOA->ODR |= (1<<1); } void digit4 (){// 4 GPIOC->ODR |= (1<<1); GPIOA->ODR |= (1<<4); GPIOA->ODR |= (1<<0); } void digit5 (){// 5 GPIOC->ODR |= (1<<0); GPIOA->ODR |= (1<<4); } void digit6 (){// 6 GPIOC->ODR |= (1<<0); } void digit7 (){// 7 GPIOA->ODR |= (1<<4); GPIOB->ODR |= (1<<0); GPIOA->ODR |= (1<<1); GPIOA->ODR |= (1<<0); } void digit8 (){// 8 } void digit9 (){// 9 GPIOA->ODR |= (1<<4); } void showdigit (int digit) { switch (digit) { case 0: digit0 (); break; case 1: digit1 (); break; case 2: digit2 (); break; case 3: digit3 (); break; case 4: digit4 (); break; case 5: digit5 (); break; case 6: digit6 (); break; case 7: digit7 (); break; case 8: digit8 (); break; case 9: digit9 (); break; default: break; }; }; // end digitsdefine from 0 to 9 and showing them //begin MULTIPLEXING void showdigits1 (int number){ int x = number / 1000 ; showdigit(x); } void showdigits2 (int number){ int y = (number % 1000) / 100 ; showdigit(y); } void showdigits3 (int number){ int z = (number % 100) / 10 ; showdigit(z); } void showdigits4 (int number){ int e = number % 10 ; showdigit(e); } void mode1 () { // transistor 1 ON others OFF GPIOA->ODR |= (1<<9); GPIOB->ODR |= (1<<5); GPIOB->ODR |= (1<<6); GPIOB->ODR ^= (1<<10); } void mode2 () { // transistor 2 ON others OFF GPIOA->ODR |= (1<<9); GPIOB->ODR |= (1<<10); GPIOB->ODR |= (1<<6); GPIOB->ODR ^= (1<<5); } void mode3 () { // transistor 3 ON others OFF GPIOA->ODR |= (1<<9); GPIOB->ODR |= (1<<5); GPIOB->ODR |= (1<<10); GPIOB->ODR ^= (1<<6); } void mode4 () { // transistor 4 ON others OFF GPIOB->ODR |= (1<<10); GPIOB->ODR |= (1<<5); GPIOB->ODR |= (1<<6); GPIOA->ODR ^= (1<<9); } MfG
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.