Forum: Mikrocontroller und Digitale Elektronik Multiplexing mit einem STM32F303?


von Naruz (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.